一、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多數據源配置的詳細闡述,我們可以根據實際需求來選擇具體的實現方式,以滿足業務需求。
原創文章,作者:SDDF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144539.html