返回顶部
首页 > 资讯 > 精选 >如何将Spring的动态数据源进行读写分离
  • 447
分享到

如何将Spring的动态数据源进行读写分离

spring数据源读写分离 2023-05-31 10:05:38 447人浏览 泡泡鱼
摘要

这篇文章给大家介绍如何将spring的动态数据源进行读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、创建基于ThreadLocal的动态数据源容器,保证数据源的线程安全性package com.bo

这篇文章给大家介绍如何将spring的动态数据源进行读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

package com.bounter.mybatis.extension;public class DynamicDataSourceHolder { private static final ThreadLocal<String> 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;public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { //使用DynamicDataSourceHolder保证线程安全 return DynamicDataSourceHolder.getDataSource(); }}

三、配置Master、Slave数据源

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

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

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

<!-- Master数据源 --><bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="url" value="${db.master.url}" /> <property name="username" value="${db.master.username}" /> <property name="password" value="${db.master.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="20" /> <property name="minIdle" value="1" /> <property name="maxActive" value="40" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /></bean><!-- Slave数据源 --><bean id="slaveDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="url" value="${db.slave.url}" /> <property name="username" value="${db.slave.username}" /> <property name="password" value="${db.slave.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="20" /> <property name="minIdle" value="1" /> <property name="maxActive" value="40" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /></bean><!-- 自定义动态数据源 --> <bean id="dataSource" class="com.bounter.mybatis.extension.DynamicDataSource"> <property name="targetDataSources">  <map key-type="java.lang.String">  <!-- 配置读写数据源 -->  <entry value-ref="masterDataSource" key="write"></entry>  <entry value-ref="slaveDataSource" key="read"></entry>  </map> </property> <property name="defaultTargetDataSource" ref="masterDataSource"></property> </bean>

四、创建数据源切面,通过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 org.springframework.stereotype.Component;import com.bounter.mybatis.extension.DynamicDataSourceHolder;@Component@Aspect@EnableAspectJAutoProxy(proxyTargetClass = true)public class DataSourceAspect { //读库数据源key private static final String DATASOURCE_KEY_READ = "read"; //查询方法清单 String[] queryMethods = {"find","get","query","count","select"};  @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;  } } }  @After("execution(* com.bounter.mybatis.dao..*.*(..))") public void after(JoinPoint point) { DynamicDataSourceHolder.clearDataSource(); }}

关于如何将Spring的动态数据源进行读写分离就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何将Spring的动态数据源进行读写分离

本文链接: https://lsjlt.com/news/224899.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何将Spring的动态数据源进行读写分离
    这篇文章给大家介绍如何将Spring的动态数据源进行读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、创建基于ThreadLocal的动态数据源容器,保证数据源的线程安全性package com.bo...
    99+
    2023-05-31
    spring 数据源 读写分离
  • Spring如何实现多数据源读写分离
    这篇文章主要介绍“Spring如何实现多数据源读写分离”,在日常操作中,相信很多人在Spring如何实现多数据源读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spri...
    99+
    2024-04-02
  • 如何进行Mysql中的mysql-proxy读写分离
    本篇文章为大家展示了如何进行Mysql中的mysql-proxy读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以配置文件的方式启动[root@host-19...
    99+
    2024-04-02
  • 数据源管理 | 主从库动态路由,AOP模式读写分离
    本文源码:GitHub·点这里 || GitEE·点这里一、多数据源应用1、基础描述在相对复杂的应用服务中,配置多个数据源是常见现象,例如常见的:配置主从数据库用来写数据,再配置一个从库读数据,这种读写分离模式可以缓解数据库压力,提高系统...
    99+
    2023-06-02
  • 在spring中使用mybatis实现对mysql数据库进行读写分离
    这期内容当中小编将会给大家带来有关在spring中使用mybatis实现对mysql数据库进行读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言    &n...
    99+
    2023-05-31
    spring mybatis mysql
  • 如何在Spring中使用MyBatis实现数据的读写分离
    如何在Spring中使用MyBatis实现数据的读写分离?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。其实现原理如下:通过Spring AOP对dao层接口进行...
    99+
    2023-05-31
    spring mybatis 读写分离
  • Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作
    在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库。Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询。因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较...
    99+
    2023-05-31
    spring mybatis 读写分离
  • Node.js Sequelize如何实现数据库的读写分离
    一、前言 在构建高并发的Web应用时,除了应用层要采取负载均衡方案外,数据库也要支持高可用和高并发性。使用较多的数据库优化方案是:通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(M...
    99+
    2022-06-04
    如何实现 数据库 Node
  • 如何理解数据库集群读写分离
    本篇内容介绍了“如何理解数据库集群读写分离”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!“灵魂拷问:解决数...
    99+
    2024-04-02
  • 如何理解数据库读写分离架构?
    如何理解数据库读写分离架构?,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。RD:数据量太大,数据库扛不住了,帮忙申请一个从库,读写分离。D...
    99+
    2024-04-02
  • Redis如何实现数据库读写分离详解
    前言 Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。Redis是一个key-...
    99+
    2024-04-02
  • Java如何利用Socket进行数据读写
    目录利用Socket进行数据读写InetAddress与URLSocket通信UDP通信Socket通信中,持续单向读写的同步问题发送端Socket操作(Socket send)接收...
    99+
    2024-04-02
  • 分析型数据仓库中如何实现读写分离
    这篇文章主要为大家展示了“分析型数据仓库中如何实现读写分离”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“分析型数据仓库中如何实现读写分离”这篇文章吧。和以 My...
    99+
    2024-04-02
  • 如何利用mycat实现mysql数据库读写分离
    这篇文章主要介绍了如何利用mycat实现mysql数据库读写分离,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是MyCAT一个彻底开源的...
    99+
    2024-04-02
  • 如何进行Elasticsearch数据写入的分析
    这期内容当中小编将会给大家带来有关如何进行Elasticsearch数据写入的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言主要讲 ES -> Lucene...
    99+
    2024-04-02
  • Linux下如何使用MaxScale实现数据库读写分离
    这篇文章主要介绍Linux下如何使用MaxScale实现数据库读写分离,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以...
    99+
    2023-06-27
  • dm8读写分离备库异常后如何进行在线重建备库
    本篇文章为大家展示了dm8读写分离备库异常后如何进行在线重建备库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。于今天核查应用报错异常的时候。监控集群日志和监控器发现...
    99+
    2024-04-02
  • 使用Mybatis Plus整合多数据源和读写分离的详细过程
    目录一、简介二、准备2.1 数据库2.2 代码三、案例3.1 查询用户库主库用户表记录3.2 查询用户库从库用户表记录3.3 新增用...
    99+
    2024-04-02
  • 如何进行Python数据编组对文字串的读写
    如何进行Python数据编组对文字串的读写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用前一节中介绍的模块,可以实现在文件中对字符串的读写。然而,有的时候,...
    99+
    2023-06-17
  • 如何进行MapReduce数据序列化读写概念的浅析
    这期内容当中小编将会给大家带来有关如何进行MapReduce数据序列化读写概念的浅析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MapReduce为处理简单数据格式(如日志文件)提供了简明的文档支持,但...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作