做php网站阿里云服务器,办公室装修图,字体 添加 wordpress,2021年十大热点事件文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言
shardingshpere-jdbc定位为轻量级 Java 框架#xff0c;在 Java 的 JDBC 层提供的… 文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言
shardingshpere-jdbc定位为轻量级 Java 框架在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库以 jar 包形式提供服务无需额外部署和依赖可理解为增强版的 JDBC 驱动完全兼容 JDBC 和各种 ORM 框架。 关于mysql配置主从复制可以参考之前写的文章0101docker mysql8镜像主从复制-运维-mysql
2、创建SpringBoot程序
2.1、创建项目
项目类型Spring Initializr
SpringBoot脚手架http://start.aliyun.com
项目名sharding-jdbc-demo
SpringBoot版本2.7.10
2.2、添加依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.gaogzhen/groupIdartifactIdsharging-jdbc-demo/artifactIdversion0.0.1-SNAPSHOT/versionnamesharging-jdbc-demo/namedescriptionDemo project for Spring Boot/descriptionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.10/versionrelativePath //parentpropertiesjava.version1.8/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingspring-boot.version2.7.10/spring-boot.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.1.1/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.3.1/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/pluginplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring-boot.version}/versionconfigurationmainClasscom.gaogzhen.shardingjdbcdemo.ShardingJdbcDemoApplication/mainClass/configurationexecutionsexecutionidrepackage/idgoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build/project2.3、生成实体类、service与Mapper
使用idea插件mybatisX根据数据库连接表生成实体类、service、mapper
第一步如下图2.3-1所示 第二步如下图2.3-2所示: 实体类
package com.gaogzhen.shardingjdbcdemo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;/*** 用户* author gaogzhen* TableName t_user*/
TableName(value t_user)
Data
public class User implements Serializable {TableField(exist false)private static final long serialVersionUID 1L;TableId(type IdType.AUTO)private Long id;/*** 用户名*/private String name;}service
package com.gaogzhen.shardingjdbcdemo.service;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;/**
* author gaogzhen
* description 针对表【t_user】的数据库操作Service
* createDate 2023-08-13 15:37:14
*/
public interface UserService extends IServiceUser {}serviceImpl
package com.gaogzhen.shardingjdbcdemo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.service.UserService;
import com.gaogzhen.shardingjdbcdemo.mapper.UserMapper;
import org.springframework.stereotype.Service;/**
* author gaogzhen
* description 针对表【t_user】的数据库操作Service实现
* createDate 2023-08-13 15:37:14
*/
Service
public class UserServiceImpl extends ServiceImplUserMapper, Userimplements UserService{}mapper
package com.gaogzhen.shardingjdbcdemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gaogzhen.shardingjdbcdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;/**
* author gaogzhen
* description 针对表【t_user】的数据库操作Mapper
* createDate 2023-08-13 15:37:14
* Entity com.gaogzhen.shardingjdbcdemo.entity.User
*/
Mapper
public interface UserMapper extends BaseMapperUser {}1.5、配置读写分离
application.properties
# 应用名称
spring.application.namesharging-jdbc-demo
# 开发环境设置
spring.profiles.activedev
# 内存模式
spring.shardingsphere.mode.typeMemory# 配置真实数据源
spring.shardingsphere.datasource.namesmaster,slave1,slave2# 配置第 1 个数据源
spring.shardingsphere.datasource.master.typecom.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-namecom.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-urljdbc:mysql://127.0.0.1:3340/db_user?allowPublicKeyRetrievaltrueuseSSLfalse
spring.shardingsphere.datasource.master.usernameroot
spring.shardingsphere.datasource.master.password123456# 配置第 2 个数据源
spring.shardingsphere.datasource.slave1.typecom.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave1.driver-class-namecom.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.jdbc-urljdbc:mysql://127.0.0.1:3341/db_user?allowPublicKeyRetrievaltrueuseSSLfalse
spring.shardingsphere.datasource.slave1.usernameroot
spring.shardingsphere.datasource.slave1.password123456# 配置第 3 个数据源
spring.shardingsphere.datasource.slave2.typecom.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave2.driver-class-namecom.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave2.jdbc-urljdbc:mysql://127.0.0.1:3342/db_user?allowPublicKeyRetrievaltrueuseSSLfalse
spring.shardingsphere.datasource.slave2.usernameroot
spring.shardingsphere.datasource.slave2.password123456# 读写分离类型如: StaticDynamic
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.typeStatic
# 写数据源名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-namemaster
# 读数据源名称多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-namesslave1,slave2# 负载均衡算法名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-namealg_round# 负载均衡算法配置
# 负载均衡算法类型
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_round.typeROUND_ROBIN
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_random.typeRANDOM
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.typeWEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave11
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave22# 打印SQl
spring.shardingsphere.props.sql-showtrue# mybatis plus 配置
mybatis.mapper-locationsclasspath:mapper/*.xml
mybatis.type-aliases-packagecom.gaogzhen.shardingjdbcdemo.entity
myds为自定义的逻辑数据源名称当前生效的负载均衡算法为轮询可以通过更换负载均衡算法名称来测试随机和权重。
2、测试
2.1、读写分离测试
package com.gaogzhen.shardingjdbcdemo;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.List;SpringBootTest
public class ReadWriteTest {Resourceprivate UserMapper userMapper;/*** 读写分离写入数据的测试*/Testpublic void testInsert(){User user new User();user.setName(张三);userMapper.insert(user);User user1 userMapper.selectById(1L);}}
2.2、事务测试
为了保证主从库间的事务一致性避免跨服务的分布式事务ShardingSphere-JDBC的主从模型中事务中的数据读写均用主库。
不添加Transactionalinsert对主库操作select对从库操作添加Transactional则insert和select均对主库操作**注意**在JUnit环境下的Transactional注解默认情况下就会对事务进行回滚即使在没加注解Rollback也会对事务回滚 /*** 事务测试*/TransactionalTestpublic void testTrans() {User user new User();user.setName(xxx001);userMapper.insert(user);ListUser users userMapper.selectList(null);}2.3、负载均衡测试
/*** 负载均衡测试*/
Test
public void testLoadBalance() {ListUser users1 userMapper.selectList(null);ListUser users2 userMapper.selectList(null);}也可以在web请求中测试负载均衡
package com.gaogzhen.shardingjdbcdemo.controller;import com.gaogzhen.shardingjdbcdemo.entity.User;
import com.gaogzhen.shardingjdbcdemo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;RestController
RequestMapping(/user)
public class UserController {Resourceprivate UserService userService;/*** 测试负载均衡策略*/GetMapping(selectAll)public void selectAll(){ListUser users userService.list();users.forEach(System.out::println);}
}命令行测试结果如下图所示 结语
如果小伙伴什么问题或者指教欢迎交流。 QQ:806797785 仓库源代码地址https://github.com/gaogzhen/shardingsphere-jdbc-demo.git 参考链接:
[1]ShardingSphere5实战教程[CP/OL].2022-09-14.p18-23.
[2]mysql官网使用配置文件文档[CP/OL].