MySQL分库分表的实现(二)--水平分表
本文介绍下使用Sharding-JDBC实现水平分表Sharding-JDBC是轻量级的 java 框架是增强版的 JDBC 驱动,使用Sharding-JDBC可以简化对分库分表之后数据相关操作。下面分别介绍下水平分表的方法。1、准备好数据库和数据表先创建一个course_db数据库然后创建2张表course_1和course_2两张表的数据结构一样使用下面的sql完成建表。SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for course_1 -- ---------------------------- DROP TABLE IF EXISTS course_1; CREATE TABLE course_1 ( cid bigint NOT NULL, cname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, user_id bigint NOT NULL, cstatus varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (cid) USING BTREE ) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT Dynamic; SET FOREIGN_KEY_CHECKS 1;建好course_1后将上面的SQL表名改成course_2完成course_2的创建。2、创建springboot工程使用springboot脚手架创建一个maven工程项目使用jdk1.8和Springboot 2.2.1.Release版本2.1 pom.xml引入依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId /dependency dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.1.20/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency dependency groupIdorg.apache.shardingsphere/groupId artifactIdsharding-jdbc-spring-boot-starter/artifactId version4.0.0-RC1/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.0.5/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependency /dependencies重点说下这2个依赖1、sharding-jdbc-spring-boot-starterSharding-JDBC的核心依赖2、druid-spring-boot-starter数据库连接池如果使用springboot内置的HikariCP连接池则不用引入该依赖。注意使用的连接池不同application里的配置需做相应的调整本文使用阿里的druid。2.2 配置application.properties这是实现Sharding-JDBC管理分库分表的核心操作可以选择使用yaml,yaml配置可参考官网https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/# shardingjdbc 分片策略 # 配置数据源给数据源起名称 spring.shardingsphere.datasource.namesm1 # 一个实体类对应两张表覆盖 spring.main.allow-bean-definition-overridingtrue #配置数据源具体内容包含连接池驱动地址用户名和密码 spring.shardingsphere.datasource.m1.typecom.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.m1.driver-class-namecom.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.m1.urljdbc:mysql://192.168.56.10:3309/course_db?serverTimezoneGMT%2B8 spring.shardingsphere.datasource.m1.usernameroot spring.shardingsphere.datasource.m1.passwordroot #指定 course 表分布情况配置表在哪个数据库里面表名称都是什么 m1.course_1 ,m1.course_2 spring.shardingsphere.sharding.tables.course.actual-data-nodesm1.course_$-{1..2} # 指定 course 表里面主键 cid 生成策略 SNOWFLAKE spring.shardingsphere.sharding.tables.course.key-generator.columncid spring.shardingsphere.sharding.tables.course.key-generator.typeSNOWFLAKE # 指定分片策略 约定 cid 值偶数添加到 course_1 表如果 cid 是奇数添加到 course_2表 spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-columncid spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expressioncourse_$-{cid % 2 1} # 打开 sql 输出日志 spring.shardingsphere.props.sql.showtrue上面主要配置以下信息数据源、表分布情况、主键生成策略、主键名、表的分片策略、sql输出生产环境建议关闭这里重点说下1、表的分片策略约定 cid 值为偶数则添加到 course_1 表为奇数添加到 course_2表通过表达式来实现course_$-{cid % 2 1}如果想id为奇数存到_1表偶数存到_2表则表表达式后面的1去掉2、当主键生成策略使用雪花算法SNOWFLAKE时数据库表的id最好声明为bigint实体类中id的类型需声明为Long要不然将不会使用雪花算法生成id。2.3 编写测试代码在单元测试中编写方法验证上面的水平分表是否生效SpringBootTest class ShardingjdbcdemoApplicationTests { Resource private CourseMapper courseMapper; //1、测试水平分表 //添加课程的方法 Test public void addCourse() { for(int i1;i10;i) { Course course new Course(); course.setCname(javai); course.setUserId(100L); course.setCstatus(Normal); courseMapper.insert(course); } } //查询课程的方法 Test public void findCourse() { QueryWrapperCourse wrapper new QueryWrapper(); wrapper.eq(cid,1240359224765054976L); Course course courseMapper.selectOne(wrapper); System.out.println(course); } }执行单元测试会发现1、添加操作中当cid为奇数时数据存到course_2表为偶数时存在到course_1表2、查询操作中cid为偶数则查询course_1表。可通过查看IDEA控制台打印出来的信息重点关注Logic SQL和Actual SQL其中Actual SQL是实际执行的库和表。3、拓展数据库连接池比较连接池核心优点核心缺点适用场景HikariCP1. 性能极致速度最快、内存占用最低2. 代码轻量约 130KB3. 自动超时回收、低延迟4. Spring Boot 2.x 默认内置1. 监控功能弱无可视化2. 扩展功能少仅核心连接池能力绝大多数生产环境、追求高性能 / 低资源占用的场景微服务、高并发Druid阿里1. 监控能力极强SQL 监控、慢查询、连接池状态2. 自带防 SQL 注入、加密配置3. 扩展功能丰富过滤器、统计4. 国内文档 / 社区支持好1. 性能略逊于 HikariCP2. 配置项多、相对重国内企业项目、需要精细化监控 / 安全管控的场景电商、金融Tomcat JDBC Pool1. Tomcat 内置、无需额外依赖2. 稳定、轻量3. 支持高可用配置1. 性能不如 HikariCP2. 监控 / 扩展能力弱Tomcat 容器内的简单项目、中小流量场景C3P01. 老牌稳定、兼容性好2. 支持配置持久化3. 自动重连机制完善1. 性能差高并发下卡顿2. 代码老旧、维护少3. 内存泄漏风险老项目维护、低并发场景不推荐新项目使用DBCP2Apache1. 开源成熟、配置灵活2. 支持多种连接验证方式1. 性能一般2. 监控能力弱3. 高并发下稳定性不如 HikariCP老项目如基于 Spring Boot 1.x 的项目、非核心业务
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422459.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!