springboot中怎么实现mybatis多数据源动态切换

springboot中怎么实现mybatis多数据源动态切换

这篇“springboot中怎么实现mybatis多数据源动态切换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot中怎么实现mybatis多数据源动态切换”文章吧。

多数据源配置引入

mybatis和mysql在springboot中的引入这里就不在说了,不了解的可以参见springboot中mysql与mybatis的引入。

springboot中怎么实现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信息,只是手动指定了数据源的。如下所示,指定了master和log两个数据源,设置master为默认数据源:

@ConfigurationpublicclassMultiDataSource{publicstaticfinalStringMASTER_DATA_SOURCE="masterDataSource";publicstaticfinalStringLOG_DATA_SOURCE="logDataSource";@Bean(name=MultiDataSource.MASTER_DATA_SOURCE)@ConfigurationProperties(prefix="datasource.master")publicDataSourcemasterDataSource(){returnDataSourceBuilder.create().build();}@Bean(name=MultiDataSource.LOG_DATA_SOURCE)@ConfigurationProperties(prefix="datasource.log")publicDataSourcelogDataSource(){returnDataSourceBuilder.create().build();}@Primary@Bean(name="dynamicDataSource")publicDynamicDataSourcedataSource(){DynamicDataSourcedynamicDataSource=newDynamicDataSource();dynamicDataSource.setDefaultTargetDataSource(masterDataSource());Map<Object,Object>dataSourceMap=newHashMap<>(4);dataSourceMap.put(MASTER_DATA_SOURCE,masterDataSource());dataSourceMap.put(LOG_DATA_SOURCE,logDataSource());dynamicDataSource.setTargetDataSources(dataSourceMap);returndynamicDataSource;}}

动态数据源路由实现

引入了配置信息之后,便是该说如何实现多数据源切换了。我们是通过实现AbstractRoutingDataSource类的determineCurrentLookupKey方法来实现数据源的动态路由,设置ThreadLocal线程保护变量存储数据源key,确保线程间不受影响。

packagecom.lazycece.sbac.mysql.multi.config;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/***@authorlazycece*/publicclassDynamicDataSourceextendsAbstractRoutingDataSource{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(DynamicDataSource.class);privatestaticfinalThreadLocal<String>DATA_SOURCE_KEY=newThreadLocal<>();staticvoidchangeDataSource(StringdataSourceKey){DATA_SOURCE_KEY.set(dataSourceKey);}staticvoidclearDataSource(){DATA_SOURCE_KEY.remove();}@OverrideprotectedObjectdetermineCurrentLookupKey(){Stringkey=DATA_SOURCE_KEY.get();LOGGER.info("currentdata-sourceis{}",key);returnkey;}}

随后,便是用AOP的方式来实现数据源的动态切换,注解和切面定义如下:

@Documented@Inherited@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})public@interfaceDataSource{Stringvalue();}@Component@AspectpublicclassDataSourceConfig{@Before("@annotation(dataSource)")publicvoidbeforeSwitchDataSource(DataSourcedataSource){DynamicDataSource.changeDataSource(dataSource.value());}@After("@annotation(DataSource)")publicvoidafterSwitchDataSource(){DynamicDataSource.clearDataSource();}}

动态数据源切换使用

动态数据源切换只需要在业务中使用@DataSource注解来标明需要使用的数据源即可,如下所示(这里只贴出关键代码):

@ServicepublicclassDynamicDataSourceServiceImplimplementsDynamicDataSourceService{@ResourceprivateUserDaouserDao;@ResourceprivateSystemLogDaosystemLogDao;@Override@DataSource(value=MultiDataSource.MASTER_DATA_SOURCE)publicvoidaddUserInfo(Useruser){userDao.insert(user);}@Override@DataSource(value=MultiDataSource.MASTER_DATA_SOURCE)publicUsergetUserInfo(Stringusername){returnuserDao.findByUsername(username);}@Override@DataSource(value=MultiDataSource.LOG_DATA_SOURCE)publicvoidaddSystemLog(SystemLogsystemLog){systemLogDao.insert(systemLog);}@Override@DataSource(value=MultiDataSource.LOG_DATA_SOURCE)publicList<SystemLog>getSystemLogInfo(DatebeginTime,DateendTime){returnsystemLogDao.findByCreateTime(beginTime,endTime);}}

以上就是关于“springboot中怎么实现mybatis多数据源动态切换”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。

发布于 2022-04-11 21:13:37
收藏
分享
海报
0 条评论
34
上一篇:git init和git clone获取git仓库的方法 下一篇:SpringBoot集成Redis操作API的方法
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码