全网整合营销服务商

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

免费咨询热线: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 


相关文章: 广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  深圳网站制作平台,深圳市做网站好的公司有哪些?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星伪静态规则如何设置?  C++如何使用std::optional?(处理可选值)  ,制作一个手机app网站要多少钱?  c# 在ASP.NET Core中管理和取消后台任务  如何打造高效商业网站?建站目的决定转化率  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  官网网站制作腾讯审核要多久,联想路由器newifi官网  电脑免费海报制作网站推荐,招聘海报哪个网站多?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在建站主机中优化服务器配置?  如何通过.red域名打造高辨识度品牌网站?  音响网站制作视频教程,隆霸音响官方网站?  如何在腾讯云服务器上快速搭建个人网站?  如何用好域名打造高点击率的自主建站?  建站之星如何保障用户数据免受黑客入侵?  建站主机CVM配置优化、SEO策略与性能提升指南  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  招商网站制作流程,网站招商广告语?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何通过万网虚拟主机快速搭建网站?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何在腾讯云免费申请建站?  建站之星如何配置系统实现高效建站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站之星如何实现五合一智能建站与营销推广?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  企业微网站怎么做,公司网站和公众号有什么区别?  已有域名和空间如何搭建网站?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  建站之星展会模版如何一键下载生成?  如何在阿里云通过域名搭建网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  香港服务器租用费用高吗?如何避免常见误区?  学校建站服务器如何选型才能满足性能需求?  如何在阿里云完成域名注册与建站?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  济南网站制作的价格,历城一职专官方网站?  如何快速搭建FTP站点实现文件共享?  ,网站推广常用方法?  广州商城建站系统开发成本与周期如何控制?  威客平台建站流程解析:高效搭建教程与设计优化方案  ,柠檬视频怎样兑换vip?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  非常酷的网站设计制作软件,酷培ai教育官方网站? 

您的项目需求

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