使用mybatis如何实现动态切换多数据源

  介绍

使用mybatis如何实现动态切换多数据源?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

具体结构如下:

使用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就可以自动切换到对应数据源。

笔者实现代码如下:

使用mybatis如何实现动态切换多数据源

<强>第一步

首先,编写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如何实现动态切换多数据源