shardingsphere多数据源(springboot+mybatis+shardin。。。
org.springframeword.boot:spring-boot-starer-web: 2.0.4release
io.shardingsphere:sharding-jdbc-spring-boot-starter:3.0.0M3
com.alibaba:druid-spring-boot-starter:1.1.9
由于项⽬需要,⾛了⼀波sharding jdbc多数据源配置,算是实战演练了,此处记录下踩过的坑。
代码githut地址(),阉割版,去掉了与项⽬相关的东西,剩⼀些核⼼配置⽂件。
1,初始版本参考⽹上各路⼤佬的博客资料写出来的,配置了两个数据源,然后在DataSourceConfig⾥⾯分别初始化,基本实现分库分表,主库的分表策略在配置⽂件⾥⾯配置,分库的分表策略是在DataSourceConfig⽂件⾥⾯初始化的时候配置⼿动写ShardingRuleConfiguration然后加到ShardingDataSource⾥⾯的(其实好⼀些的处理⽅法应该是都写在配置⽂件⾥⾯的,但是我没做出来)。两个DataSourceConfig⽂件分别初始化⾃⼰的数据源,mapper,xmlmapper,基本就完成了最初的版本。启动时的时候去除掉Spring boot⾃带的DataSourceAutoConfiguration⽂件。
2,初始版本完成之后,发现的第⼀个问题就是以前项⽬⾥⾯写的⼀个mybatis的失效了,的作⽤是拦截mybatis所有的insert ,update操作,添加⼀些业务字段,没改多数据源之前是正常使⽤的,改了之后发现失效了,然后debug模式启动发现确实是已经初始化过了,⾄于为什么没有⽣效,不知道。
解决思路:看源码了,先到前⾯去除掉的DataSourceAutoConfiguration⽂件,看看源码,好像跟mybatis没什么关系,然后搜了下spring boot⾃动配置mybatis的初始化过程到了MybatisAutoConfiguration⽂件,也就是mybatis的初始化配置⽂件,
,AutoConfigAfter,字⾯理解执⾏于参数的class ⽂件初始化之后,这个类⾥⾯有个构造函数如下
看起来好像到⼀个跟有点关系的了,然后看看下⾯哪个地⽅被调⽤,如下:
在初始化SqlSessionFactory的时候会把添加到实例⾥⾯,对⽐⾃⼰的Config⽂件,少了这么⼀步,所以初始化了但是没有⽣效时因为没有添加到mybatis 的实例⾥⾯。
对应的改⼀下⾃⼰的配置⽂件,把interceptor加进去,再启动测试,正常使⽤,搞定。
3 ,后续发现的第⼆个问题,druid的sql监控没有了。为啥没有了,不知道,继续原因改呗。
第⼀个猜测,druid相关的配置没有⽣效,⼜开始debug配置⽂件,发现了⼀个问题
此处DataSource初始化是直接调⽤DataSourceBuilder的.build⽅法初始化的,没有任何参数,好吧,再看看DataSourceBuilder的代码
这个地⽅会去获取DataSource 的类型,然后结果拿到的就是HikariDataSource ,⿁⿁,怪不得没sql 监控了,初始化出来的DataSource 压根就不是DruidDataSource ,原因到了,继续改了,怎么改了,先看sharding 初始化DataSource 的源码,实际上Sharding jdbc 的DataSource 初始化是根据配置⽂件⾥⾯type 属性来的,代码在SpringBootConfiguration ⽂件
这个地⽅在初始化DataSourceMap的时候会到配置⽂件⾥⾯ sharding.jdbc.datasource.names值对应的数据源,然后配置对应属性看代码会发现这给放主要会调⽤两个⽅法
⼀个是public static <T> T handle(final Environment environment, final String prefix, final Class<T> targetClass)⽅法
该⽅法作⽤是将当前environment下的配置⽂件⾥⾯前缀为prefix的属性转换为⼀个targetClass对象
代码⾥⾯就是将前⾯为sharding.jdbc.datasource.ds的属性转换为⼀个map对象
第⼆个⽅法为DataSource getDataSource(final String dataSourceClassName, final Map<String, Object> dataSourceProperties)
源码如下,
意思是先到DataSource类型的class对象,然后循环前⾯获取到的map对象,利⽤反射到每⼀个key对应的set⽅法,将value值作为set⽅法的参数赋值给实例化出来的对象,然后将这个对象返回给上层的DataSouce初始化⽅法。这就实现了根据配置⽂件类实例化不同类型的DataSource实例。
⽽实际上我这边是有问题的,项⽬确认使⽤druid连接池,所以我没有把这些⽅法都copy到⾃⼰代码⾥⾯,⽽是在⾃⼰的DataSourceConfig⽂件⾥⾯直接初始化⼀个DruidDataSource实例返回,初始化的时候直接读取配置⽂件的各个属性值赋值。改好之后再次启动测试,就可以正常启动druid的sql监控了。
以上!
springboot和过滤器
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论