理解spring动态切换数据源,需要对spring具有一定的了解

工作中经常遇到读写分离,数据源切换的问题,那么以下是本作者实际工作中编写的代码  与大家分享一下!

1.定义注解 DataSource

package com.gomecar.index.datasource;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 数据源切换注解* @author xiaotian**/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface DataSource {String value() default "read";}

2. 定义切面DataSourceAspect

package com.gomecar.index.datasource;import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;/*** 用于数据库读写分离的切面* @author xiaotian**/
@Aspect
public class DataSourceAspect {//日志private Logger logger = Logger.getLogger(this.getClass());/*** 拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源** @param point* @throws Exception*/public void intercept(JoinPoint point) throws Exception {Class<?> target = point.getTarget().getClass();MethodSignature signature = (MethodSignature) point.getSignature();for (Class<?> clazz : target.getInterfaces()) {resolveDataSource(clazz, signature.getMethod());}resolveDataSource(target, signature.getMethod());}/*** 提取目标对象方法注解和类型注解中的数据源标识** @param clazz* @param method*/private void resolveDataSource(Class<?> clazz, Method method) {try {Class<?>[] types = method.getParameterTypes();// 默认使用类型注解dataSourcePointcutdataSourcePointcutif (clazz.isAnnotationPresent(DataSource.class)) {DataSource source = clazz.getAnnotation(DataSource.class);DynamicDataSourceHolder.putDataSource(source.value());}// 方法注解可以覆盖类型注解Method m = clazz.getMethod(method.getName(), types);if (m != null && m.isAnnotationPresent(DataSource.class)) {DataSource source = m.getAnnotation(DataSource.class);DynamicDataSourceHolder.putDataSource(source.value());}} catch (Exception e) {logger.error("切换数据源error", e);}}//通知public void before(JoinPoint point){Object target = point.getTarget();String method = point.getSignature().getName();//反射获取接口Class<?>[] classz = target.getClass().getInterfaces();//获取返回值类型 Class<?>[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();try {//获取方法Method m = classz[0].getMethod(method, parameterTypes);//根据方法上注解  获取只读数据库连接池 或者只写数据库连接池if (m != null && m.isAnnotationPresent(DataSource.class)) {//根据注解值获取数据库连接池DataSource data = m.getAnnotation(DataSource.class);DynamicDataSourceHolder.putDataSource(data.value());System.out.println(data.value());}} catch (Exception e) {// TODO: handle exception
        }}
}

3.获取动态数据源DynamicDataSource

package com.gomecar.index.datasource;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/*** 动态获取数据源* @author xiaotian**/
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceHolder.getDataSouce();}}

4.数据源持有者DynamicDataSourceHolder

package com.gomecar.index.datasource;
/*** 数据库连接池 持有者* 将数据库连接绑定到当前线程* @author xiaotian**/
public class DynamicDataSourceHolder {//绑定当前线程public static final ThreadLocal<String> holder = new ThreadLocal<String>();//设置数据源public static void putDataSource(String name) {holder.set(name);}//获取数据源public static String getDataSouce() {return holder.get();}
}

转载于:https://www.cnblogs.com/shoutn/p/7800916.html

spring 多数据源动态切换相关推荐

  1. Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. Proxool配置多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间遇到多数据源动态切换问题,总结一下,做个记录,以备后续之需! 首先附上proxool连接池的配置方法:http://3 ...

  3. springboot多数据源动态切换和自定义mybatis分页插件

    1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...

  4. SpringBoot+AOP实现多数据源动态切换

    SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...

  5. Spring-Boot + AOP实现多数据源动态切换

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...

  6. springboot使用mybatis多数据源动态切换的实现

    需求:项目使用了读写分离,或者数据进行了分库处理,我们希望在操作不同的数据库的时候,我们的程序能够动态的切换到相应的数据库,执行相关的操作. 首先,你需要一个能够正常运行的springboot项目,配 ...

  7. spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换

    作者:码农教程 出自:码农教程 原文:manongjc.com/detail/14-ucsldoihyzmwcui.html 当项目中存在多数据源时,就涉及到数据源的动态切换,通过研究,特此记录一下. ...

  8. Spring Boot 如何动态切换多数据源?

    大约在19年的这个时候,老同事公司在做医疗系统,需要和HIS系统对接一些信息,比如患者.医护.医嘱.科室等信息.但是起初并不知道如何与HIS无缝对接,于是向我取经. 最终经过讨论采用了视图对接的方式, ...

  9. spring boot多数据源动态切换, 多数据源事务管理

    1 . 项目目标 实现 不同数据源的切换 (使用AbstractRoutingDataSource) 不同数据源之间,事物管理,多个数据源之间同时commit或者同时rollback 兼容不同的连接池 ...

最新文章

  1. 标准输入流和输出流分别是啥,高效字符流的方法
  2. Git 推送到远程仓库
  3. 开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」
  4. 关于android:windowNoTitle不起作用的解决办法
  5. Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
  6. [转载] Python中不可变集合的使用frozenset()方法
  7. MySQL存储过程定时任务
  8. Linux基本操作之重定向文件
  9. Win11筛选键怎么关闭?Win11关闭筛选键的两种方法
  10. CTWAP和CTNET的区别
  11. C++扑克牌类的设计
  12. 基于pyod中机器学习与神经网络方法的异常值识别方法合集(含2022年全国服务外包大赛实例)
  13. linux ftp匿名用户,linux vsftp 匿名用户的设置
  14. MySQL字段约束条件,外键约束条件,表关系
  15. 什么是数据科学?如何把数据变成产品?
  16. 34. 在排序数组中查找元素的第一个和最后一个位置——二分法的魔鬼细节 小记
  17. 西门子博途梯形图写的Modbus RTU 程序
  18. linux怎么用ping通测试连接,ping网络是否连通的步骤_使用ping命令检查网络连通性的方法-系统城...
  19. 数据库原理与应用(4)——三个世界及其有关概念
  20. .NET Core Ocelot Consul

热门文章

  1. struts2 实现多文件限制上传
  2. tabs选项卡切换效果(jquery版)
  3. Asp.net页面间传值方式汇总
  4. django模板导入js,css等外部文件
  5. Android开发学习笔记:Gallery和GridView浅析
  6. 把字符串里的整数倒叙一个一个打印出来
  7. mybaits二十八:逆向工程
  8. 智能化招聘管理系统Moka完成B轮1.8亿人民币融资,高瓴资本领投
  9. 【3y】从零单排学Redis【青铜】
  10. Android 必须知识 PWA Android Instant Apps