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 ...
随机推荐
- h5课件是什么?h5(html5)怎样实现交互动画开发?-----浅谈h5交互动画课件的优势
目前很多交互课件,尤其幼儿类的交互课件以动画和交互相结合的类型居多,越来越多的教育机构发现了这种课件对于幼儿的吸引力远大于其他类型的课件,随着flash逐渐被市场淘汰,动画和交互相结合的html5跨平 ...
- AttributePriority
还有AttributePriority,我们可以设置编译时优先级.如果我们对目标标记了多个aspect,这样postsharp就不确定注入先后顺序,这样不能确保正确性,在vs编译时候我们会看见警告:T ...
- Spring的IOC原理
1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- ignoreDependencyType(Class class)方法使用
该方法字面意思是忽略依赖类,注释给出的解释是在自动装配时忽略指定类型的依赖注入. 经过我在网上查的资料,发现自动装配有两种方式: 一种是在xml配置文件中的<beans>标签中配置一个属性 ...
- glide 长方形图片显示圆角问题
目前业务是RecyclerView嵌套RecyclerView,子RecyclerView里面显示图片,图片显示方式又分为 多图和单图显示方式(这个是已经调试好的效果) 测试显示结果只有单张图片不显示 ...
- Python【每日一问】10
问:请解释一下迭代器 答:可以被 __next__() 函数调用并不断返回下一个值的对象称为迭代器:Iterator
- Python对wav文件的重采样
例如从2channel,4.41k hz 重采样到 1 channel,16k hz def downsampleWav(src, dst, inrate=44100, outrate=16000, ...
- docker镜像的常用操作
获取镜像 比如说我们可以这样操作 当然把这个镜像拉过来时间非常长. 查看镜像列表 命令: docker images 说明: 使用docker images命令可以列出本地主机上已有的镜像. 信息 ...
- 通过JS 给这个input加一个事件 获得焦点,回车事件绑定
通过JS 给这个input加一个事件 就是获得焦点就行了 window.onload = function(){ var oInput = document.getElementById(" ...
- 字符串排序--string类的使用
最近帮他们做了一个简单的c++的题目,以前做过,当时是借鉴的别人的代码,现在也忘得差不多了,不过思路还有,现在正好可以再温习一下. 题目要求如下: 先输入你要输入的字符串的个数.然后换行输入该组字符串 ...