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 ...
随机推荐
- VLC播放器
为了将多个视频放在一个窗口,最开始想用的是windows media player ,6个视频,把整个电脑卡得不动了(显卡太弱,是多输出口的,没法换),于是又想把视频压缩成一个,网上的大部分软件要收费 ...
- rocketmq 4.3.2 解决远程不能消费问题,解决未识别到公网IP问题
1.解决远程不能消费问题 问题描述: nameserver和broker启动后,用tools(命令如下)能发送消息和消费消息,在局域网服务器能发送消息,消费启动后收不到消息通知问题 sh tools. ...
- 1、编写一个简单Makefile模板
一.Makefile简介 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...
- 使HTML5支持RTSP流 微信直播RTSP流 微信播放RTSP直播流(HTML5播放rtsp,web播放rtsp,微信支持rtsp)
一.大家都知道HTML5的VIDEO可以播放视频,但是H5不支持RTSP播放,所以需要中间件! 二.我们经理长年的努力,开发了HTML5支持RTSP的中间件,使HTML5支持RTSP直播! 三.不卡顿 ...
- SSO+PHS 同步问题修正解决
参照URL: https://blogs.technet.microsoft.com/latam/2018/03/27/using-the-consistencyguid/ https://chinn ...
- bat文件与Vbs文件常用操作(获取用户输入,执行VBS文件)
bat文件: set /P StrInput="输入数字:" echo 输入的数字为%StrInput% set /P Flg="是否执行(y/n):" IF ...
- Read The Docs搭建
#!/bin/sh ########################### base ###################### yum -y update yum -y install yum-u ...
- 「Mobile Testing Summit China 2017」第三届中国移动互联网测试开发大会-讲师征集
时至北京盛夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会正在紧锣密鼓的筹备中.只要你关注软件质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话 ...
- 7.6.2 break 语句
7.6.2 break 语句 程序执行到循环中的break语句时,会种植包含它的循环,并继续执行下一阶段. 如果break语句位于嵌套循环内,它只会影响包含它的当前循环. break还可用于因其他原因 ...
- 前端使用nginx 达到前后分离的开发目的
前言: 由于现在要开发一套基于python 的日志分析系统,设计到日志收集,分析,可视化输出,所以我使用前后端分离的做法.记录学习的过程: 00x1: 下载配置nginx:在E盘创建Service 目 ...