springboot中怎么实现mybatis多数据源动态切换
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇"springboot中怎么实现mybatis多数据源动态切换"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收
千家信息网最后更新 2025年02月02日springboot中怎么实现mybatis多数据源动态切换多数据源配置引入
动态数据源路由实现
动态数据源切换使用
这篇"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为默认数据源:
@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 ThreadLocalDATA_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@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 { @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 ListgetSystemLogInfo(Date beginTime, Date endTime) { return systemLogDao.findByCreateTime(beginTime, endTime); }}
以上就是关于"springboot中怎么实现mybatis多数据源动态切换"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
数据
数据源
动态
切换
配置
内容
信息
文章
注解
知识
篇文章
线程
路由
业务
两个
代码
价值
切面
功能
变量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
客户端修改sql数据库
科技感互联网背景图片
viso 数据库形状
启东软件开发周期多长
保护网络安全的事例
未来网络安全保卫工作发展趋势
服务器电源达到多少度开始散热
冬奥会网络安全唯一供应商
看数据库脚本用什么工具看
网络安全承诺书怎么填
数据库索引分为几种怎样使用
jdbc连接服务器数据库
国家电网APp服务器繁忙
完美世界对战平台服务器
windows 服务器取证
ssl服务器可能需要更新
横琴网络安全
db2数据库增加用户
无锡常见网络技术标准
浙江苍穹互联网科技
中国国内论文数据库
物联网络技术应用简介
电视设备服务器指的是什么
外卖系统软件开发
sql数据库共享锁
yggl数据库查询
上海教育网络安全管理平台
魔兽世界服务器 分组
绍兴服务器公司
闵行区正规软件开发销售价格