springboot中mybatis多数据源动态切换实现
目录
- 多数据源配置引入
- 动态数据源路由实现
- 动态数据源切换使用
- 案例源码
多数据源配置引入
mybatis和mysql在springboot中的引入这里就不在说了,不了解的可以参见springboot中mysql与mybatis的引入。
数据源配置如下:
datasource:master:type: com.alibaba.druid.pool.DruidDataSourcejdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_master?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=trueusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driverlog:type: com.alibaba.druid.pool.DruidDataSourcejdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_log?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=trueusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driver
mybatis的配置引入如下:
mybatis:config-location: classpath:mybatis-config.xmlmapper-locations: classpath:com/lazycece/sbac/mysql/data/dao/*/mapper/*.xml
【springboot中mybatis多数据源动态切换实现】这里已然使用的是springboot的自动配置功能配置mybatis信息,只是手动指定了数据源的。如下所示,指定了master和log两个数据源,设置master为默认数据源:
@Configurationpublic 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
动态数据源路由实现
引入了配置信息之后,便是该说如何实现多数据源切换了。我们是通过实现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 DATA_SOURCE_KEY = new ThreadLocal<>(); static void changeDataSource(String dataSourceKey) {DATA_SOURCE_KEY.set(dataSourceKey); }static void clearDataSource() {DATA_SOURCE_KEY.remove(); }@Overrideprotected 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@Aspectpublic class DataSourceConfig {@Before("@annotation(dataSource)")public void beforeSwitchDataSource(DataSource dataSource) {DynamicDataSource.changeDataSource(dataSource.value()); }@After("@annotation(DataSource)")public void afterSwitchDataSource() {DynamicDataSource.clearDataSource(); }}
动态数据源切换使用
动态数据源切换只需要在业务中使用@DataSource注解来标明需要使用的数据源即可,如下所示(这里只贴出关键代码):
@Servicepublic class DynamicDataSourceServiceImpl implements DynamicDataSourceService {@Resourceprivate UserDao userDao; @Resourceprivate SystemLogDao systemLogDao; @Override@DataSource(value = https://www.it610.com/article/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 getSystemLogInfo(Date beginTime, Date endTime) {return systemLogDao.findByCreateTime(beginTime, endTime); }}
案例源码
案例源码地址: https://github.com/lazycece/springboot-actual-combat/tree/master/springboot-ac-mysql/springboot-ac-mysql-multi
到此这篇关于springboot中mybatis多数据源动态切换实现的文章就介绍到这了,更多相关springboot mybatis多数据源动态切换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- Activiti(一)SpringBoot2集成Activiti6
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募