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)的更多相关文章

  1. ShardingSphere Hint模式 SpringBoot + Mybatis

    ShardingSphere Hint模式不需要对sql进行解析,就可以进行数据库或者表的路由.下面贴一下代码,关于SpringBoot + Mybatis + ShardingSphere怎样结合. ...

  2. spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid

    SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...

  3. 12.SpringBoot+MyBatis(XML)+Druid

    转自:https://www.cnblogs.com/MaxElephant/p/8108342.html 主要是在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml ...

  4. 搭建Springboot+mybatis+redis+druid

    2019独角兽企业重金招聘Python工程师标准>>> 准备工作 JDK:1.8 使用技术:SpringBoot.Dubbo.Mybatis.Druid 开发工具:Intelj ID ...

  5. Mysql8.0主从复制搭建,shardingsphere+springboot+mybatis读写分离

    1.安装mysql8.0 首先需要在192.167.3.171上安装JDK. 下载mysql安装包,https://dev.mysql.com/downloads/,找到以下页面下载. 下载后放到li ...

  6. Springboot整合shardingsphere和druid进行读写分离

    最近在使用springboot整合shardingsphere和druid实现mysql数据库读写分离时遇到了一些问题,特此记录一下. 依赖版本 Springboot 2.1.6.RElEASE sh ...

  7. SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页

    前言 本篇文章主要讲述的是SpringBoot整合Mybatis.Druid和PageHelper 并实现多数据源和分页.其中SpringBoot整合Mybatis这块,在之前的的一篇文章中已经讲述了 ...

  8. 记录一下自己搭建springboot+mybatis+druid 多数据源的过程

    前言  上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...

  9. 【springboot spring mybatis】看我怎么将springboot与spring整合mybatis与druid数据源

    目录 概述 1.mybatis 2.druid 壹:spring整合 2.jdbc.properties 3.mybatis-config.xml 二:java代码 1.mapper 2.servic ...

随机推荐

  1. 学习Python3 天眼查 爬虫

    刚开始学习Python,不愿意看基础,记忆不好,那些语法记不住,直接上个项目,这样比较深刻 刚好公司有个情况要查企业的信息,就想做个爬虫吧,有验证码的不愿意搞,那是个老大难问题,就选择了天眼查 过程都 ...

  2. Dell Inspiron 620 / Vostro 260 BIOS 开启 AHCI 模式

    1.Dell Vostro 260 台式机,WIN7 旗舰版   2.登陆 DELL 官方支持站点,获取 MS-A10.exe 安装文件   3.从网络中获取 AMIBCP.exe 工具,双击打开此程 ...

  3. 发布一个PHP包到Packagist, 然后使用Composer安装

    Composer 能够方便的进行项目的依赖管理,  当我们发布一个包并且希望别人通过Composer安装的时候, 就需要将包发布到Composer的包仓库Packagist上面. 下面进行详细的说明一 ...

  4. 【转】从PowerDesigner概念设计模型(CDM)中的3种实体关系说起

    PowerDesigner概念模型的relationship .inheritance. association 从PowerDesigner概念设计模型(CDM)中的3种实体关系说起

  5. Express路由

    1. 路由器的配置分为两个,一个是需要做页面的渲染,一个是需要直接进行对数据进行输出,对于路由器的配置需要对路由器在公共的app.js进行注册与注入才能生效,否则是不能生效的.配置时根据不同的应用场景 ...

  6. (整理) .NET IIS性能优化

    本文收集了部分性能优化的方式,缓存.压缩.线程池调整等等,仅供参考. 1 .NET 程序中的调整 程序Sqlhelper中使用缓存 使用JSON序列化器(Jil)取代Json.NET 2 .NET 程 ...

  7. JS获取option的value和text

    window.onload = function(){ //首先获得下拉框的节点对象: var select = document.getElementById("s1"); // ...

  8. stm32 uart 中断 蜜汁bug

    在项目中,使用stm32f103,配置uart1接收RXNE中断,使用DMA来进行UART1的发送. 初始化代码如下: void uart_init(u32 bound) { GPIO_InitTyp ...

  9. Linux系统的RAID磁盘阵列

    RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,以硬件( ...

  10. mongodb mac

    ==> mongodb To have launchd start mongodb now and restart at login: brew services start mongodb O ...