這篇“springboot中怎么實現mybatis多數據源動態切換”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“springboot中怎么實現mybatis多數據源動態切換”文章吧。
mybatis和mysql在springboot中的引入這里就不在說了,不了解的可以參見springboot中mysql與mybatis的引入。
數據源配置如下:
datasource: master: type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_master?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver log: type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_log?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver
mybatis的配置引入如下:
mybatis: config-location: classpath:mybatis-config.xml mapper-locations: classpath:com/lazycece/sbac/mysql/data/dao/*/mapper/*.xml
這里已然使用的是springboot的自動配置功能配置mybatis信息,只是手動指定了數據源的。如下所示,指定了master和log兩個數據源,設置master為默認數據源:
@Configuration
public class MultiDataSource {
public static final String MASTER_DATA_SOURCE = "masterDataSource";
public static final String LOG_DATA_SOURCE = "logDataSource";
@Bean(name = MultiDataSource.MASTER_DATA_SOURCE)
@ConfigurationProperties(prefix = "datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = MultiDataSource.LOG_DATA_SOURCE)
@ConfigurationProperties(prefix = "datasource.log")
public DataSource logDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "dynamicDataSource")
public DynamicDataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
Map<Object, Object> dataSourceMap = new HashMap<>(4);
dataSourceMap.put(MASTER_DATA_SOURCE, masterDataSource());
dataSourceMap.put(LOG_DATA_SOURCE, logDataSource());
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
}引入了配置信息之后,便是該說如何實現多數據源切換了。我們是通過實現AbstractRoutingDataSource類的determineCurrentLookupKey方法來實現數據源的動態路由,設置ThreadLocal線程保護變量存儲數據源key,確保線程間不受影響。
package com.lazycece.sbac.mysql.multi.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* @author lazycece
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSource.class);
private static final ThreadLocal<String> DATA_SOURCE_KEY = new ThreadLocal<>();
static void changeDataSource(String dataSourceKey) {
DATA_SOURCE_KEY.set(dataSourceKey);
}
static void clearDataSource() {
DATA_SOURCE_KEY.remove();
}
@Override
protected Object determineCurrentLookupKey() {
String key = DATA_SOURCE_KEY.get();
LOGGER.info("current data-source is {}", key);
return key;
}
}隨后,便是用AOP的方式來實現數據源的動態切換,注解和切面定義如下:
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface DataSource {
String value();
}
@Component
@Aspect
public class DataSourceConfig {
@Before("@annotation(dataSource)")
public void beforeSwitchDataSource(DataSource dataSource) {
DynamicDataSource.changeDataSource(dataSource.value());
}
@After("@annotation(DataSource)")
public void afterSwitchDataSource() {
DynamicDataSource.clearDataSource();
}
}動態數據源切換只需要在業務中使用@DataSource注解來標明需要使用的數據源即可,如下所示(這里只貼出關鍵代碼):
@Service
public class DynamicDataSourceServiceImpl implements DynamicDataSourceService {
@Resource
private UserDao userDao;
@Resource
private SystemLogDao systemLogDao;
@Override
@DataSource(value = MultiDataSource.MASTER_DATA_SOURCE)
public void addUserInfo(User user) {
userDao.insert(user);
}
@Override
@DataSource(value = MultiDataSource.MASTER_DATA_SOURCE)
public User getUserInfo(String username) {
return userDao.findByUsername(username);
}
@Override
@DataSource(value = MultiDataSource.LOG_DATA_SOURCE)
public void addSystemLog(SystemLog systemLog) {
systemLogDao.insert(systemLog);
}
@Override
@DataSource(value = MultiDataSource.LOG_DATA_SOURCE)
public List<SystemLog> getSystemLogInfo(Date beginTime, Date endTime) {
return systemLogDao.findByCreateTime(beginTime, endTime);
}
}以上就是關于“springboot中怎么實現mybatis多數據源動態切換”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。