shardingsphere多数据源(springboot + mybatis+shardingsphere+druid)
org.springframeword.boot:spring-boot-starer-web: 2.0.4release
io.shardingsphere:sharding-jdbc-spring-boot-starter:3.0.0M3
org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1
com.alibaba:druid-spring-boot-starter:1.1.9
由于项目需要,走了一波sharding jdbc多数据源配置,算是实战演练了,此处记录下踩过的坑。
代码githut地址(https://github.com/autLory/test_sharding_pro),阉割版,去掉了与项目相关的东西,剩一些核心配置文件。
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监控了。
以上!
shardingsphere多数据源(springboot + mybatis+shardingsphere+druid)的更多相关文章
- ShardingSphere Hint模式 SpringBoot + Mybatis
ShardingSphere Hint模式不需要对sql进行解析,就可以进行数据库或者表的路由.下面贴一下代码,关于SpringBoot + Mybatis + ShardingSphere怎样结合. ...
- spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid
SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...
- 12.SpringBoot+MyBatis(XML)+Druid
转自:https://www.cnblogs.com/MaxElephant/p/8108342.html 主要是在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml ...
- 搭建Springboot+mybatis+redis+druid
2019独角兽企业重金招聘Python工程师标准>>> 准备工作 JDK:1.8 使用技术:SpringBoot.Dubbo.Mybatis.Druid 开发工具:Intelj ID ...
- Mysql8.0主从复制搭建,shardingsphere+springboot+mybatis读写分离
1.安装mysql8.0 首先需要在192.167.3.171上安装JDK. 下载mysql安装包,https://dev.mysql.com/downloads/,找到以下页面下载. 下载后放到li ...
- Springboot整合shardingsphere和druid进行读写分离
最近在使用springboot整合shardingsphere和druid实现mysql数据库读写分离时遇到了一些问题,特此记录一下. 依赖版本 Springboot 2.1.6.RElEASE sh ...
- SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
前言 本篇文章主要讲述的是SpringBoot整合Mybatis.Druid和PageHelper 并实现多数据源和分页.其中SpringBoot整合Mybatis这块,在之前的的一篇文章中已经讲述了 ...
- 记录一下自己搭建springboot+mybatis+druid 多数据源的过程
前言 上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...
- 【springboot spring mybatis】看我怎么将springboot与spring整合mybatis与druid数据源
目录 概述 1.mybatis 2.druid 壹:spring整合 2.jdbc.properties 3.mybatis-config.xml 二:java代码 1.mapper 2.servic ...
随机推荐
- JDK安装教程
打开我的电脑,在D盘中新建一个文件夹,名字为develop 进入develop,创建一个新文件夹,名字叫做jdk 双击JDK的安装包, .4.出如图所示的框,选择下一步 .5.更改安装路径,选择更改 ...
- pc端布局的一点思考
编写pc端页面需要注意些什么? 1.自适应最小屏幕,在小屏幕上样式不能错乱. 在桌面屏幕各分辨率使用比例中可以看到各桌面分辨率的使用比例,日常pc端开发我们会考虑到适配1024宽度大小的屏幕. 对于管 ...
- centos7 Ruby环境变量配置
ruby安装参考博客:https://blog.csdn.net/yelllowcong/article/details/78362370 (Redis之集群redis-trib.rb环境的搭建-y ...
- LeetCode【110. 平衡二叉树】
对于平衡二叉树,就是左右深度相差1 就可以另外弄一个函数,计算深度,然后, 在原函数上进行比较深度是否相差1,再输出true or false. 至于迭代就可以,比较完左右节点,再比较各自的左右节点. ...
- Pyrit help
Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Morahttps://github.com/JPaulMora/PyritThis code is ...
- C# 通过GUID生成不重复的ID
/// <summary> /// 获得32位字符长度的ID /// </summary> /// <param name="information" ...
- Access Token 与 Refresh Token【转载哒科普啊】
Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因 ...
- C语言列出真分数序列代码及解析
问题描述 按递增顺序依次列出所有分母为60,分子小于60的最简分数. 问题分析 分子.分母只有公因数1的分数叫做最简分数或者说分子和分母是互质数的分数,叫做最简分数,又称既约分数,如2/3,8/9,3 ...
- 关于std::thread
std::thread基本用法 1.普通函数: std::thread thread(func, param, ...) 2.类成员函数: std::thread thread(&class_ ...
- Spring MVC参数封装传递
在Spring MVC中,前端JSP页面可以传递 基本类型(int,String).实体类型.包装类型.数组类型.集合类型(List.map )等. 假如在传递的类型中有 Date类型的字段,需要在 ...