全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Spring配置动态数据源实现读写分离的方法

前言

最近因为工作的需要,要搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,有需要的朋友们可以参考学习。

首先是配置数据源

<!--读数据源配置-->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!--写数据源配置-->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!-- 动态数据源 -->
<bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" > 
 <!-- 已配置的数据源 --> 
 <property name="targetDataSources">  
 <map>   
  <entry key="READ" value-ref="readDataSource"/>   
  <entry key="WRITE" value-ref="writeDataSource"/>  
 </map> 
 </property> 
 <!-- 默认的数据源 --> 
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

数据源是如何切换的呢?通过动态数据源的配置我们知道原来是通过key来进行切换,这里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,我们可以编写自己的动态数据源类DynamicDataSource来继承它。

public class DynamicDataSource extends AbstractRoutingDataSource { 
 @Override 
 protected Object determineCurrentLookupKey() {  
  return DataSourceContextHolder.getType(); 
 }
}

还需要一个存放key的地方DataSourceContextHolder 为保证切换时线程安全我们使用ThreadLocal来保存我们的key。

public class DataSourceContextHolder {
 private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);
 public static final String DATA_SOURCE_WRITE = "WRITE";
 public static final String DATA_SOURCE_READ = "READ";
 // 线程本地环境
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

 // 设置数据源类型
 public static void setType(String type) {
  if(LOGGER.isDebugEnabled())
   LOGGER.debug("==============切换数据源,类型:"+type+"================");
  contextHolder.set(type);
 }
 // 获取数据源类型
 public static String getType() {
  return (contextHolder.get());
 }
 // 清除数据源类型
 public static void clearType() {
  contextHolder.remove();
 }
}

好了,我们可以通过操作DataSourceContextHolder来实现数据源动态的切换了。小伙伴们可能会说了,难道每次调用方法都要手动选择要切换的数据源类型?当然不是啦,Spring AOP登场。

@Component
@Aspect
public class DynamicDataSourceAspect {

 @Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")
 public void readMethodPointcut() {}

 @Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")
 public void writeMethodPointcut() {}

 @Before("readMethodPointcut()")
 public void switchReadDataSource(){
  //System.out.println("============切换到读数据源===========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);
 }

 @Before("writeMethodPointcut()")
 public void switchWriteDataSource(){
  //System.out.println("=============切换到写数据源==========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);
 }

}

总结

好啦,以上就是这篇文章的全部内容了,在访问Mapper(本项目使用的是MyBatis啦,相当于是DAO)中查询方法时会切换到读数据源,增、删、改方法会切换到写数据源。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# spring  # 读写分离  # 多数据源  # spring动态数据源  # 详解Nginx服务器中HTTP Headers相关的模块配置使用  # Spring动态数据源实现读写分离详解  # Mybatis注解实现多数据源读写分离详解  # resty更新header控制api版本数据源读写分离  # 切换到  # 我们可以  # 自己的  # 的是  # 在这里  # 好了  # 都要  # 说了  # 朋友们  # 还需要  # 这篇文章  # 来实现  # 好啦  # 要使  # 法会  # 小伙伴们  # 为保证  # 有疑问  # defaultTargetDataSource  # WRITE 


相关文章: 如何快速搭建高效简练网站?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何选择美橙互联多站合一建站方案?  如何快速搭建二级域名独立网站?  免费视频制作网站,更新又快又好的免费电影网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  网站制作的步骤包括,正确网址格式怎么写?  如何快速搭建自助建站会员专属系统?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  PHP 500报错的快速解决方法  高防服务器租用如何选择配置与防御等级?  如何通过虚拟主机快速搭建个人网站?  建站之星免费模板:自助建站系统与智能响应式一键生成  建站之星导航如何优化提升用户体验?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何通过智能用户系统一键生成高效建站方案?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何在阿里云购买域名并搭建网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  成都网站制作报价公司,成都工业用气开户费用?  如何在建站之星网店版论坛获取技术支持?  公司门户网站制作流程,华为官网怎么做?  简单实现Android验证码  建站VPS推荐:2025年高性能服务器配置指南  如何在万网开始建站?分步指南解析  建站之星导航菜单设置与功能模块配置全攻略  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  专业公司网站制作公司,用什么语言做企业网站比较好?  如何用y主机助手快速搭建网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何在云指建站中生成FTP站点?  高端建站三要素:定制模板、企业官网与响应式设计优化  家庭建站与云服务器建站,如何选择更优?  香港服务器租用每月最低只需15元?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何快速配置高效服务器建站软件?  实现虚拟支付需哪些建站技术支撑?  深圳网站制作的公司有哪些,dido官方网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何用腾讯建站主机快速创建免费网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  实例解析angularjs的filter过滤器  佛山网站制作系统,佛山企业变更地址网上办理步骤?  C#怎么使用委托和事件 C# delegate与event编程方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。