一。目的
在组内方便的切换主库和从库
二。具体做法
代码部分改动
1. 增加了一个注解DataSourceChange
public @interface DataSourceChange {
boolean fromSlave() default false;
}
2. 增加了MultipleDataSourceInterceptor
在这个函数里,利用AOP,将当前的DataSourceNameContextHolder 切换到从库上
主要需要关注的代码是
//为了减少影响面,目前只对×Service类里拥有DataSourceChange注解方法 进行AOP
private final static String EDP = "execution(@com.DataSourceChange * com" +
"..*Service.*(..))";
// 这是切换DataSourceNameContextHolder的部分代码
try {
if (fromSlave) {
DataSourceNameContextHolder.set(DataSourceNameConstant.SLAVE);
}
obj = joinPoint.proceed(args);
} catch (Throwable e) {
e.printStackTrace();
} finally {
if (fromSlave) {
DataSourceNameContextHolder.clear();
}
}
3.增加了一个Wrapper
将原来ProductDao的部分方法挪了出来,放在这里,使用方法
@DataSourceChange(fromSlave = true)
public List<String> getIncludeSupplierIds() {
return xxDao.getIncludeSupplierIds();
}
三。验证方法
打开spring连接transaction的日志,查看使用了哪个连接。
四。结论
1. 如何使用
如果想让某个由Spring管理的Service里的某个方法访问从库,只需要给Service加上注解 @DataSourceChange(fromSlave = true), 则这个Service里的方法会自动访问从库。(前提是,Service里的DAO是由spring+mybatis管理的).
譬如
@DataSourceChange(fromSlave = true)
public List<String> fooA() {
return xxx.fooA();
}
2. 不足
我尝试过,将这个注解加到DAO这一层,譬如
@Repository
public interface xxDao {
@DataSourceChange(fromSlave = true)
List<String> fooA();
}
启动时Spring会报错,提示 Could not generate CGLIB subclass of final class.
猜测原因可能是 mybatis 自动生成Mapper类时,使用了CGLIB。 但是在spring再对这个interface进行代理时,必须用JDK默认的proxy才行。。所以这里可能会有冲突。
还希望有别的同学能来指导具体的原因
如果这个service有@Transaction注解时,也不能使用这种方法。。。 这好像是Spring的一个bug,使用Transaction时,只会使用默认的dataSource
(已经由组内其他同事解决了。)
相关推荐
在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...
Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况
在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...
标题 "mybatis spring 多数据源" 涉及到的是在Java开发中,如何使用MyBatis和Spring框架来管理多个数据库连接。这通常在需要处理来自不同数据源的数据或者实现数据库读写分离的场景下应用。MyBatis是一个优秀的持久...
本文将深入探讨如何在一个基于Spring框架的应用中实现多数据源的动态切换,以"基于SSI+Oracle架构的多数据源动态切换实例"为例进行详细讲解。 首先,我们需要理解什么是多数据源。多数据源是指在一个应用中同时连接...
Spring多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...
在企业级应用开发中,Spring框架的广泛使用使得数据源管理变得尤为重要,特别是在处理多数据库环境时。"Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了...
本资源"spring多数据源.rar"聚焦于Spring框架如何处理多个不同的数据源,这对于需要连接到多个数据库的应用程序至关重要。下面将详细介绍Spring多数据源的配置和使用。 首先,我们需要理解“多数据源”这一概念。在...
"Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...
接下来,描述中提到的"Spring多数据源atomikos所有jar包.pdf"很可能是包含详细的步骤和配置示例的文档,这份文档可能涵盖了如何在Spring项目中添加和配置Atomikos的jar包,以及如何进行多数据源的设置。通常,我们...
### 基于注解的Spring多数据源配置与使用详解 #### 一、引言 在企业级应用开发中,经常会遇到需要从多个数据库拉取数据的情况,比如进行跨库查询、定时任务中的数据分析及报表统计等。Spring框架作为Java开发领域的...
### Spring多数据源配置与分布式数据管理 #### 环境及框架介绍 在本案例中,我们将探讨如何在基于Tomcat服务器的环境下配置多个数据源,并实现分布式数据的交互。该系统的架构主要包括:Tomcat作为应用服务器,...
总结,Spring多数据源的创建和切换主要涉及数据源的配置、动态数据源路由以及业务中的数据源切换操作。通过这种方式,我们可以灵活地在不同数据源之间进行切换,满足复杂业务场景的需求。在实际项目中,要注意线程...
在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,而随着业务复杂性的增加,往往需要处理来自多个数据源的数据。"Spring多数据源的实现"是一个关键的...
Spring框架提供了一种灵活的方式来配置和管理多个数据源,使得这种需求变得简单易行。本文将详细介绍如何在Spring应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储...
下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...