2.sjdbc2.0.3集成-基于spring

阿飞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源码目录结构图

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180813G07YX200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券