shardingsphere多数据源(springboot+mybatis+shardingsphere+druid)

aut-lory aut-lory     2022-12-01     184

关键词:

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-proxy分库分表以及多租户安装使用(代码片段)

...动态增加也不方便,诸如此类很多问题。方案:ShardingSphere-Proxy基于数据库表有一个租户字段1.ShardingSphe 查看详情

shardingsphere实践——shardingsphere介绍

...分布式ID(6)多数据源5.分库分表中间件简介二、ShardingSphere产品路线1.ShardingSphere-JDBC2.ShardingSphere-Proxy3.ShardingSphere-Sidecar(规划中)4.适用场景5.线路规划三、ShardingSphere核心概念1.运行模式(1)内存模式... 查看详情

shardingsphere分库分表schema名称导致npe问题排查记录

前段时间把ShardingSphere升级到了5.1.1版本,奈何官方版本升级太快跟不上速度,这不最近又发现了一个BUG。问题现象数据库做了分库分表,在需要查询多表数据进行merge的时候发生了一个NPE的异常。Causedby:java.lang.NullPointerExceptionato... 查看详情

专访sphereex创始团队:获数百万美金投资,接棒shardingsphere打造全新分布式生态

...、场景越来越多,也为用户带来了新的管理和使用难题。ShardingSphere做的事情是为用户提供一个稳定、统一的接入层,帮助用户用统一的方式去使用碎片化的数据库,发挥各种数据库的长处。5月14日,数据前沿技术初创公司SphereE... 查看详情

shardingsphere的强制路由(代码片段)

ShardingSphere的强制路由随着项目的越来越庞大,用户量越来越多,分库分表的操作在工作中是不可避免的,而市场上分库分表的解决方案有很多,ShardingSphere就是经常使用到的一种分库分表技术。我们知道ShardingSphere可以进行分库... 查看详情

shardding_jdbc推荐使用properties配置文件(代码片段)

spring.main.allow-bean-definition-overriding=true#覆盖#sharding-jdbc分片规则配置#数据源spring.shardingsphere.datasource.names=m1spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDa 查看详情

springboot+shardingsphere实现读写分离,分库分表(代码片段)

...压力。一.操作的工程目录二.读写分离application.yml​spring:shardingsphere:datasource:names:master,slave#数据源配置master:driver-class-name:com.mysql.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourceurl:jdbc:mysql://localhost:3306/master0?useUnicode=true&characterEnc... 查看详情

springboot+shardingsphere实现读写分离,分库分表(代码片段)

...压力。一.操作的工程目录二.读写分离application.yml​spring:shardingsphere:datasource:names:master,slave#数据源配置master:driver-class-name:com.mysql.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourceurl:jdbc:mysql://localhost:3306/master0?useUnicode=true&characterEnc... 查看详情

springboot+shardingsphere实现读写分离,分库分表(代码片段)

...压力。一.操作的工程目录二.读写分离application.yml​spring:shardingsphere:datasource:names:master,slave#数据源配置master:driver-class-name:com.mysql.jdbc.Drivertype:com.alibaba.druid.pool.DruidDataSourceurl:jdbc:mysql://localhost:3306/master0?useUnicode=true&characterEnc... 查看详情

多租户数据库实现解决方案汇总

...1;=============概览::ShardingSphere(apache.org)ShardingSphere、Mycat原理_MayMatr 查看详情

shardingsphere实现数据库读写分离,主从库分离,docker详细教程(代码片段)

一.什么是ShardingSphere引用官方的话:ApacheShardingSphere是一款分布式的数据库生态系统,可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。ApacheShardingSphere设计哲... 查看详情

shardingsphere实践——数据分片(代码片段)

目录一、功能详解1.背景2.核心概念(1)表(2)数据节点(3)分片(4)行表达式(5)分布式主键3.使用规范(1)SQL(2)分页二、实现细节1.解析引擎(1)抽象语法树... 查看详情

理论+实战,详解shardingsphere-jdbc(代码片段)

摘要:ApacheShardingSphere是一款分布式的数据库生态系统,它包含两大产品:ShardingSphere-Proxy和ShardingSphere-JDBC。本文分享自华为云社区《看完这一篇,ShardingSphere-jdbc实战再也不怕了》,作者:勇哥java实战分... 查看详情

shardingsphere实践——数据加密(代码片段)

目录一、功能详解1.背景2.核心概念3.使用规范(1)支持项(2)不支持项二、实现细节1.处理流程详解2.整体架构3.加密规则4.加密处理过程5.解决方案详解(1)新上线业务(2)已上线业务改造6.中间... 查看详情

shardingsphere实践——数据加密(代码片段)

目录一、功能详解1.背景2.核心概念3.使用规范(1)支持项(2)不支持项二、实现细节1.处理流程详解2.整体架构3.加密规则4.加密处理过程5.解决方案详解(1)新上线业务(2)已上线业务改造6.中间... 查看详情

shardingsphere实践——数据加密(代码片段)

目录一、功能详解1.背景2.核心概念3.使用规范(1)支持项(2)不支持项二、实现细节1.处理流程详解2.整体架构3.加密规则4.加密处理过程5.解决方案详解(1)新上线业务(2)已上线业务改造6.中间... 查看详情

看完这一篇,shardingsphere-jdbc实战再也不怕了(代码片段)

谈到分库分表中间件时,我们自然而然的会想到ShardingSphere-JDBC。这篇文章,我们聊聊ShardingSphere-JDBC相关知识点,并实战演示一番。1ShardingSphere生态ApacheShardingSphere是一款分布式的数据库生态系统,它包含两大产品:ShardingSphere-Pr... 查看详情

基于shardingsphere,实现数据“一键脱敏”!

点击关注公众号,Java干货及时送达来源:https://jaskey.github.io/blog/2020/03/18/sharding-sphere-data-desensitization/在真实业务场景中,数据库中经常需要存储某些客户的关键性敏感信息如:身份证号、银行卡号、姓名、手机号... 查看详情