• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Spring动态数据源实现读写分离详解

java 搞代码 4年前 (2022-01-05) 21次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了Spring动态数据源实现读写分离,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、创建基于ThreadLocal的动态数据源容器,保证数据源的线程安全性

 package com.bounter.mybatis.extension; /** * 基于ThreadLocal实现的动态数据源容器,保证DynamicDataSource的线程安全性 * @author simon * */ public class DynamicDataSourceHolder { private static final ThreadLocal dataSourceHolder = new ThreadLocal(); public static void setDataSource(String dataSourceKey) { dataSourceHolder.set(dataSourceKey); } public static String getDataSource() { return dataSourceHolder.get(); } public static void clearDataSource() { dataSourceHolder.remove(); } } 

二、定义Spring动态数据源扩展类,用来实现Master、Slave数据源动态切换

 package com.bounter.mybatis.extension; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * 自定义的Spring 动态数据源扩展类,用来实现Master、Slave数据源动态切换 * @author simon * */ public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { //使用DynamicDataSourceHolder保证线程安全 return DynamicDataSourceHolder.getDataSource(); } } 

三、配置Master、Slave数据源

1. db.properties配置Master、Slave数据信息

 # Master DB db.master.url=jdbc:mysql://192.168.168.110:3306/bounter?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false db.master.username=bounter # AES encrypt,Base64 encode db.master.password=ZNhnEjauk3pecZxxS84ofA== # Slave DB db.slave.url=jdbc:mysql://192.168.168.111:3306/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false db.slave.username=bounter # AES encrypt,Base64 encode db.slave.password=jFYmt2f57RHhzItYDhWiSA== 

 

2. Spring 配置文件配置Master、Slave连接池,动态数据源

 <!-- Master数据源 --> <!-- 基本属性 url、user、password --><!-- 配置初始化大小、最小、最大 --><!-- 配置获取连接等待超时的时间 --><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><!-- 配置监控统计拦截的filters --><!-- Slave数据源 --> <!-- 基本属性 url、user、password --><!-- 配置初始化大小、最小、最大 --><!-- 配置获取连接等待超时的时间 --><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><!-- 配置监控统计拦截的filters --><!-- 自定义动态数据源 -->  <map> <!-- 配置读写数据源 --></map>

四、创建数据源切面,通过AOP实现根据Dao层方法前缀动态选取读、写数据源

 package com.bounter.mybatis.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.context.annotation.EnableAspectJAutoProxy; import o<em style="color:transparent">来源[email protected]搞@^&代*@码网</em>rg.springframework.stereotype.Component; import com.bounter.mybatis.extension.DynamicDataSourceHolder; /** * 数据源切面,通过dao方法前缀决定访问读、写数据源 * @author simon * */ @Component @Aspect @EnableAspectJAutoProxy(proxyTargetClass = true) public class DataSourceAspect { //读库数据源key private static final String DATASOURCE_KEY_READ = "read"; //查询方法清单 String[] queryMethods = {"find","get","query","count","select"}; /** * dao层方法执行前选择数据源 * @param point */ @Before("execution(* com.bounter.mybatis.dao..*.*(..))") public void before(JoinPoint point) { // 获取到当前执行的方法名 String methodName = point.getSignature().getName(); //匹配查询方法 for(String queryMethod : queryMethods) { if(methodName.startsWith(queryMethod)) { //查询方法设置数据源为读库 DynamicDataSourceHolder.setDataSource(DATASOURCE_KEY_READ); break; } } } /** * dao层方法执行完后清空数据源选择 * @param point */ @After("execution(* com.bounter.mybatis.dao..*.*(..))") public void after(JoinPoint point) { DynamicDataSourceHolder.clearDataSource(); } } 

github源码地址:https://github.com/13babybear/bounter-mybatis

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持gaodaima搞代码网

以上就是Spring动态数据源实现读写分离详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Spring动态数据源实现读写分离详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址