阿飞Javaer,转载请注明原创出处,谢谢!
本篇文章讲解如何在(spring、mybatis)架构基础上集成sharding-jdbc(版本为2.0.3)进行分库分表;
假设分库分表行为如下:
将t_user表分到2个库(afei_user_0~afei_user_1)中;
其他表不进行分库分表,保留在afei_test库中;
1. POM配置
spring集成mybatis访问mysql,且以druid为数据源需要的依赖有:
2. 配置数据源
spring-datasource.xml配置所有需要的数据源如下--t_user分库后需要的2个库:和,以及不分库分表的默认库afei_test:
properties配置文件内容如下:
3. 集成sharding数据源
spring-sharding.xml配置如下:
说明:spring-sharding.xml配置的分库分表规则为:
t_user表分到id为afei_user_$的2个库中,表名保持不变;其他表在id为afei_test库中,不分库也不分表,即默认数据源;集成sharding-jdbc的核心就是将SqlSessionFactoryBean需要的dataSource属性修改为,把数据源交给sharding-jdbc处理;
分库逻辑的代码很简单,源码如下:
这段代码参考sharding-jdbc源码中接口的实现即可,例如;
4. 注意事项
无法识别sharding-jdbc分库分表规则inline-expression问题,例如:
根本原因:
根本原因是spring把当做占位符,这种表达式,spring会尝试去properties文件中找key为的属性。但是这里是sharding-jdbc分库分表规则的inline表达式,需要spring忽略这种行为。否则会抛出异常:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder '0..1' in value "afei_user_$.t_user"
解决办法:
配置:
或者:
5. Main测试
Main.java用来测试分库分表是否OK,其源码如下:
6. 日志验证
增加logback.xml文件到resources目录后,运行Main.java,就会有如下日志:
由这段日志可知,执行第一条SQL时,由于id=1,所以路由到afei_user_1数据库;执行第2条SQL时,由于id=2,所以路由到afei_user_0数据库;执行第3条SQL时,由于t_config属于默认数据源,不参与分库分表,所以路由到afei_test数据库,即默认数据源;
7. 附demo源码目录结构图
sharding-jdbc分库分表demo源码目录结构图
领取专属 10元无门槛券
私享最新 技术干货