使用mybatis如何实现动态切换多数据源?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
具体结构如下:
在搭建过程集成mybatis的时候,考虑到单一数据源无法满足实际业务需要,故结合c#的开发经验,进行多数据源动态集成。
mybatis的多数据源可以采用两种方式进行,第一种是分包方式实现,这种方式灵活性不高,而且较为繁琐,故不做过多介绍。
另一种方式是采用AOP的思想,进行注解动态切换,参考网上教程,核心思想是依靠继承AbstractRoutingDataSource,重写determineCurrentLookupKey()方法,在该方法中使用DatabaseContextHolder获取当前线程的数据源。
但是网上方法大都是首先定义好各个数据源,比如有三个数据源,就需要实现定义好三个数据源,笔者感觉这种方法,在我目前这套框架中不够灵活,因为笔者采用的是微服务框架,考虑到各个服务都有可能使用不同的数据源,而多数据源动态切换是放在公共方法中实现的,如果每有新的数据源就要定义一个,对代码的侵入性太高,在c#中,选择数据源很容易,根据连接名称就可以切换过去,如下所示:
& lt; connectionStrings> & lt;添加名称=皌est1"connectionString=?127.0.0.1;服务器用户id=根;密码=123456;数据库=db1; charset=utf8"providerName=癕ySql.Data.MySqlClient"/比; & lt;添加名称=皌est2"connectionString=?127.0.0.1;服务器用户id=根;密码=123456;数据库=db2; charset=utf8"providerName=癕ySql.Data.MySqlClient"/比; & lt;添加名称=皌est3"connectionString=?127.0.0.1;服务器用户id=根;密码=123456;数据库=db4; charset=utf8"providerName=癕ySql.Data.MySqlClient"/比; & lt; connectionStrings>
能不能像c#这样根据连接名称就自动选择呢,笔者的连接配置如下所示:
春: 应用程序: 名称:csg-auth 数据源: kbase: - driverClassName: com.kbase.jdbc.Driver jdbcUrl: jdbc: kbase://127.0.0.1 用户名:DBOWN 密码: jdbc: - driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc: mysql://localhost: 3306/nacos& # 63; serverTimezone=% 2 b8&格林尼治时间;useUnicode=false& characterEncoding=utf8& useSSL=false 用户名:根 密码:123456 connName:纳科 - driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc: mysql://localhost: 3306/tpi& # 63; serverTimezone=% 2 b8&格林尼治时间;useUnicode=false& characterEncoding=utf8& useSSL=false 用户名:根 密码:123456 connName: tpi
其中kbase不用理会,是我们公司自己的数据库,jdbc是维护的连接集合,其中connName就是我们自定义的连接名称,
根据connName就可以自动切换到对应数据源。
笔者实现代码如下:
<强>第一步强>
首先,编写DynamicDataSource类集成AbstractRoutingDataSource,重写determineCurrentLookupKey方法,该方法主要作用是选择数据源的关键
代码如下:
/* * *动态数据源 * */公开课DynamicDataSource延伸AbstractRoutingDataSource { @Override 保护对象determineCurrentLookupKey () { 返回DataSourceHolder.getDataSource (); } }
<强>第二步强>
第二部编写DataSourceHolder类,提供设置,获取,情况数据源的方法,如下所示:
公共类DataSourceHolder {/* * *线程本地环境 */私有静态最终ThreadLocal数据源=new ThreadLocal ();/* * *设置数据源 */公共静态孔隙setdatasource(字符串connName) { dataSources.set (connName); }/* * *获取数据源 */公共静态字符串getDataSource () { 返回dataSources.get (); }/* * *清楚数据源 */公共静态孔隙clearDataSource () { dataSources.remove (); } }
<强>第三步强>
第三步,编写DataSourceConfig类,该类主要作用是读取配置文件中的数据源连接集合,以及维护项目数据源的Bean对象,
代码如下:
@ component @ConfigurationProperties (“spring.datasource") 公开课DataSourceConfig { 私人Listjdbc; 公共Map<对象,Object>getDataSourceMap () { Map 使用mybatis如何实现动态切换多数据源