spring 多数据源动态切换
理解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 多数据源动态切换相关推荐
- Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Proxool配置多数据源动态切换
2019独角兽企业重金招聘Python工程师标准>>> 前段时间遇到多数据源动态切换问题,总结一下,做个记录,以备后续之需! 首先附上proxool连接池的配置方法:http://3 ...
- springboot多数据源动态切换和自定义mybatis分页插件
1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...
- SpringBoot+AOP实现多数据源动态切换
SpringBoot+AOP实现多数据源动态切换 背景 设计总体思路 步骤 背景 系统后端需要访问多个数据库,现有的数据库连接配置写入配置文件中.后端需要从一个数据库的配置表里动态的读取其它mysql ...
- Spring-Boot + AOP实现多数据源动态切换
2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据 ...
- springboot使用mybatis多数据源动态切换的实现
需求:项目使用了读写分离,或者数据进行了分库处理,我们希望在操作不同的数据库的时候,我们的程序能够动态的切换到相应的数据库,执行相关的操作. 首先,你需要一个能够正常运行的springboot项目,配 ...
- spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换
作者:码农教程 出自:码农教程 原文:manongjc.com/detail/14-ucsldoihyzmwcui.html 当项目中存在多数据源时,就涉及到数据源的动态切换,通过研究,特此记录一下. ...
- Spring Boot 如何动态切换多数据源?
大约在19年的这个时候,老同事公司在做医疗系统,需要和HIS系统对接一些信息,比如患者.医护.医嘱.科室等信息.但是起初并不知道如何与HIS无缝对接,于是向我取经. 最终经过讨论采用了视图对接的方式, ...
- spring boot多数据源动态切换, 多数据源事务管理
1 . 项目目标 实现 不同数据源的切换 (使用AbstractRoutingDataSource) 不同数据源之间,事物管理,多个数据源之间同时commit或者同时rollback 兼容不同的连接池 ...
最新文章
- 标准输入流和输出流分别是啥,高效字符流的方法
- Git 推送到远程仓库
- 开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」
- 关于android:windowNoTitle不起作用的解决办法
- Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
- [转载] Python中不可变集合的使用frozenset()方法
- MySQL存储过程定时任务
- Linux基本操作之重定向文件
- Win11筛选键怎么关闭?Win11关闭筛选键的两种方法
- CTWAP和CTNET的区别
- C++扑克牌类的设计
- 基于pyod中机器学习与神经网络方法的异常值识别方法合集(含2022年全国服务外包大赛实例)
- linux ftp匿名用户,linux vsftp 匿名用户的设置
- MySQL字段约束条件,外键约束条件,表关系
- 什么是数据科学?如何把数据变成产品?
- 34. 在排序数组中查找元素的第一个和最后一个位置——二分法的魔鬼细节 小记
- 西门子博途梯形图写的Modbus RTU 程序
- linux怎么用ping通测试连接,ping网络是否连通的步骤_使用ping命令检查网络连通性的方法-系统城...
- 数据库原理与应用(4)——三个世界及其有关概念
- .NET Core Ocelot Consul