一、Mybatis多数据源配置
在实际开发中,我们常常需要连接多个数据源,此时我们就需要使用Mybatis多数据源配置。下面我们来详细讲解Mybatis多数据源配置。
我们先来看一下如下的两个数据源的配置文件:
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3307/test2?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
在Mybatis中,我们可以通过配置文件来指定多个数据源,在其中添加多个数据源配置,例如:
mybatis.mapper-locations=classpath*:com/example/demo/mapper/*.xml
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3307/test2?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
二、Mybatis多数据源打印SQL
Mybatis多数据源配置后,我们可以使用druid提供的日志输出过滤器监控SQL执行情况,具体代码如下:
spring:
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3307/test2?characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
druid:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
filter:
- stat
- wall
- log4j
max-active: 20
max-wait: 1000
default-auto-commit: false
initial-size: 1
test-while-idle: true
validation-query: SELECT 'x'
validation-query-timeout: 2
三、Mybatis多数据源切换
Mybatis多数据源切换可以使用Spring提供的AbstractRoutingDataSource类来实现,具体代码如下:
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
通过DataSourceContextHolder的getDataSource()方法获取数据源key,然后切换到对应的数据源。
四、Mybatis多数据源连接池
Mybatis多数据源连接池我们可以使用HikariCP连接池,其配置代码如下:
spring:
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
idle-timeout: 60000
maximum-pool-size: 20
minimum-idle: 5
max-lifetime: 1800000
connection-timeout: 30000
auto-commit: false
mybatis:
mapper-locations: classpath*:mapper/**/*.xml
type-aliases-package: cn.lyn4ever.pojo
configuration:
map-underscore-to-camel-case: true
五、Mybatis多数据源事务管理
Mybatis多数据源事务管理需要我们进行手动编写代码实现事务管理,具体代码如下:
@Service
public class TestService {
@Autowired
private CRUDMapper masterCRUDMapper;
@Autowired
private CRUDMapper slaveCRUDMapper;
@Transactional(transactionManager = "dynamicTransactionManager",propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void test1(){
masterCRUDMapper.insert();
slaveCRUDMapper.insert();
}
}
六、Mybatis多数据源切换组件
Mybatis多数据源切换组件可以使用Dynamic DataSource Router,它是一个开源的数据源路由框架,支持针对多个数据源的动态切换,具体代码如下:
public class DataSourceRouter {
public static final String MASTER = "master";
public static final String SLAVE = "slave";
private static final ThreadLocal
dataSourceKey = new ThreadLocal<>();
private static final List
dataSourceKeys = new ArrayList<>();
public static void clearDataSourceKey() {
dataSourceKey.remove();
}
public static String getDataSourceKey() {
return dataSourceKey.get();
}
public static List
getDataSources() {
return dataSourceKeys;
}
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
public static void setDataSourceKeys(List
dataSourceKeys) {
DataSourceRouter.dataSourceKeys.addAll(dataSourceKeys);
}
public static boolean containsDataSource(String dataSource) {
return dataSourceKeys.contains(dataSource);
}
}
七、Mybatis多数据源不切库问题
在使用Mybatis多数据源时,可能会遇到不切库(即一直使用默认库进行操作)的问题,此时需要我们注意数据源的key是否一致,具体代码可以通过debug来找到原因。
八、Mybatis多数据源ds不切库问题
在使用Mybatis多数据源时,注意不同的数据源切换之间需要关闭之前的连接资源,否则会出现不能切换到正确的数据源的情况,解决方法可以通过增加Druid多数库连接池的数量来避免这种情况。
九、Mybatis多数据源配置失效
在使用Mybatis多数据源时,可能会遇到每次都默认使用单数据源的情况,此时需要检查代码中的配置是否正确,以及是否进行了相关的配置生效检查。
十、MybatisPlus多数据源配置
MybatisPlus多数据源配置方式与Mybatis相同,只需要在其配置文件中添加多个数据源即可,例如:
spring.datasource.master.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
spring.datasource.master.username=root
spring.datasource.master.password=root
spring.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.slave.url=jdbc:mysql://localhost:3307/test2?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
spring.datasource.slave.username=root
spring.datasource.slave.password=root
spring.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
以上内容就是我们对于Mybatis多数据源配置的详细阐述,我们可以根据实际需求来选择具体的实现方式,以满足业务需求。