
一、前言Sharding-jdbc是开源的数据库操作中间件定位为轻量级Java框架在Java的JDBC层提供的额外服务。它使用客户端直连数据库以jar包形式提供服务无需额外部署和依赖可理解为增强版的JDBC驱动完全兼容JDBC和各种ORM框架。官方文档地址https://shardingsphere.apache.org/document/current/cn/overview/二、代码实战2.1 创建springboot项目本节用到的具体基础代码创建过程可以参考《Spring-Boot整合MyBatis》2.2 引入依赖dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-jdbc-spring-boot-starter/artifactIdversion4.0.0-RC1/version/dependency2.3 修改application.ymlspring:main:allow-bean-definition-overriding:trueshardingsphere:props:sql:show:true#显示sqlsharding:default-data-source-name:ds1#配置默认数据源ds1 默认数据源,主要用于写.如果和masterslave节点都不配置则三个数据源都会当作salve在新增\修改\删除会报错masterslave:name:ms#配置主从名称master-data-source-name:ds1#置主库master,负责数据的写入slave-data-source-names:ds2,ds3#配置从库slave节点load-balance-algorithm-type:round_robin#配置slave节点的负载均衡均衡策略,采用轮询机制datasource:names:ds1,ds2,ds3#配置数据源ds1:#master-ds1数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicodetruecharacterEncodingutf8serverTimezoneUTCallowMultiQueriestrueuseSSLfalseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5ds2:#slave-ds2数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicodetruecharacterEncodingutf8serverTimezoneUTCallowMultiQueriestrueuseSSLfalseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5ds3:#slave-ds3数据库连接信息type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://127.0.0.1:3306/springboot?useUnicodetruecharacterEncodingutf8serverTimezoneUTCallowMultiQueriestrueuseSSLfalseusername:springpassword:spring#123maxPoolSize:100minPoolSize:5Props的其他相关配置acceptor.size: # accept连接的线程数量,默认为cpu核数2倍executor.size: #工作线程数量最大默认值: 无限制max.connections.size.per.query: # 每个查询可以打开的最大连接数量,默认为1check.table.metadata.enabled: #是否在启动时检查分表元数据一致性默认值: falseproxy.frontend.flush.threshold: # proxy的服务时候,对于单个大查询,每多少个网络包返回一次proxy.transaction.type: # 默认LOCAL,proxy的事务模型 允许LOCAL,XA,BASE三个值,LOCAL无分布式事务,XA则是采用atomikos实现的分布式事务 BASE目前尚未实现proxy.opentracing.enabled: # 是否启用opentracingproxy.backend.use.nio: # 是否采用netty的NIO机制连接后端数据库,默认False ,使用epoll机制proxy.backend.max.connections: # 使用NIO而非epoll的话,proxy后台连接每个netty客户端允许的最大连接数量(注意不是数据库连接限制) 默认为8proxy.backend.connection.timeout.seconds: #使用nio而非epoll的话,proxy后台连接的超时时间,默认60s2.3 验证创建StudentController.javaRestControllerRequestMapping(/api/student)publicclassStudentController{AutowiredprivateStudentServicestudentService;GetMapping(/save)publicStringaddUser(){StudentsnewStudent();s.setName(wnonewRandom().nextInt());s.setSex(M);s.setSno(10000newRandom().nextInt());studentService.add(s);returnsuccess;}GetMapping(/findStudent)publicStudentfindUsers(intsno){returnstudentService.queryStudentBySno(sno);}}启动日志中三个数据源初始化成功调用 http://localhost:8080/api/student/save一直进入到ds1主节点调用 http://localhost:8080/api/student/findStudent?sno1一直进入到ds2、ds3节点并且轮询进入