内容简介:有一种场景,调用ServiceA时,使用A数据源,调用ServiceB时,使用B数据源。在不改变原有代码的情况下,这个如何来实现呢。下面是一种实现方式,供参考:比如在操作com.project.service.goods.GoodsService.java时,key应该设置成goods。这里有个问题是,service类跟数据源是分开的,怎么样才能通知到
动态切换数据源原理
有一种场景,调用ServiceA时,使用A数据源,调用ServiceB时,使用B数据源。在不改变原有代码的情况下,这个如何来实现呢。
下面是一种实现方式,供参考:
- 将各个数据源用key-value形式保存到map中,如下面这个类:
class RouteDatasource { Map<String, Datasource> map = new HashMap<>(); map.push("goods", goodsDatasource); map.push("order", orderDatasource); 获取Connection public Connection getConnection() { ... } }
- 在操作某个Service类的时候选择对应的数据源
比如在操作com.project.service.goods.GoodsService.java时,key应该设置成goods。这里有个问题是,service类跟数据源是分开的,怎么样才能通知到
RouteDatasource类使用goods的key呢。
方法简单,使用 ThreadLocal
类,在使用GoodsService类时,ThreadLocal中放入key,然后RouteDatasource类从ThreadLocal中取。
class RouteDatasource { Map<String, Datasource> map... map.push("goods", goodsDatasource); map.push("order", orderDatasource); 获取Connection public Connection getConnection() { String key = ThreadLocal.get(); Datasource ds = map.get(kay); return ds.getConnection(); } }
获取key完成了,如何设置key呢?不可能在每次使用前put一下吧。容易出错,代码也不美观。有一种方案是使用spring的AOP方式实现。
AOP可以在执行某个Service方法前做一些操作,那么我们就把设置key的操作放在AOP的before行为中。
大致思路是:判断当前方法所在类的package的名称来区分需要设置哪个key。
比如:com.project.service.goods.GoodsService.save()方法的package,是com.project.service.goods开头
那么AOP代码可以这样写
String methodInfo = ... if(methodInfo.startWith("com.project.service.goods")) { ThreadLocal.set("goods") }
完整的代码如下:
@Component @Aspect public class DynamicDataSourceAspect { @Before("execution(* com.project.service..*.*(..))") public void before(JoinPoint jp) { String methodName = jp.getSignature().getDeclaringTypeName(); if (StringUtils.isBlank(methodName)) { return; } if (methodName.startsWith("com.project.service.goods")) { ThreadLocal.set("goods") } else if (methodName.startsWith("com.project.service.order")) { ThreadLocal.set("order") } } }
这样,以后只需要配置DynamicDataSourceAspect类即可。
数据源动态切换,主要思想是通过事先定义好的Key-Value进行动态获取。主要使用了ThreadLocal和Spring AOP方式去串连起来。
spring为我们提供了数据源切换类 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
,这个类的作用就是一开始提到的RouteDatasource类。感兴趣的同学可以看下代码,很简单。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring项目中使用两种方法动态切换数据源,多数据源切换
- 苞米豆-多数据源 2.3.4 发布:优化底层,支持嵌套切换
- 苞米豆-多数据源 2.3.4 发布:优化底层,支持嵌套切换
- Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换
- 搞定 Spring Boot 多数据源(二):动态数据源
- 数据源管理 | 基于JDBC模式,适配和管理动态数据源
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
智能Web算法(第2版)
【英】Douglas G. McIlwraith(道格拉斯 G. 麦基尔雷思)、【美】Haralambos Marmanis(哈若拉玛 玛若曼尼斯)、【美】Dmitry Babenko(德米特里•巴邦科) / 达观数据、陈运文 等 / 电子工业出版社 / 2017-7 / 69.00
机器学习一直是人工智能研究领域的重要方向,而在大数据时代,来自Web 的数据采集、挖掘、应用技术又越来越受到瞩目,并创造着巨大的价值。本书是有关Web数据挖掘和机器学习技术的一本知名的著作,第2 版进一步加入了本领域最新的研究内容和应用案例,介绍了统计学、结构建模、推荐系统、数据分类、点击预测、深度学习、效果评估、数据采集等众多方面的内容。《智能Web算法(第2版)》内容翔实、案例生动,有很高的阅......一起来看看 《智能Web算法(第2版)》 这本书的介绍吧!