springboot中怎么实现mybatis多数据源动态切换
springboot中怎么实现mybatis多数据源动态切换
这篇“springboot中怎么实现mybatis多数据源动态切换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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信息,只是手动指定了数据源的。如下所示,指定了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多数据源动态切换”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
mybatis如何编写一个自定义插件(mybatis plus优点)
mybatisplus优点?Mybatis-Plus是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改...
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
MyBatis和jeesite多表查询的方法
MyBatis和jeesite多表查询的方法这篇文章主要介绍了My...
-
Mybatis怎么实现ResultMap结果集
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录