`
干宝周
  • 浏览: 14669 次
社区版块
存档分类
最新评论

spring多数据源

阅读更多

一。目的

在组内方便的切换主库和从库

 

二。具体做法

代码部分改动

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

(已经由组内其他同事解决了。)

0
0
分享到:
评论
8 楼 干宝周 2014-08-10  
7454103 写道


这个问题也可以解决!事务方法的 datasoruce也是可以指定的!
@DataSourceChange 加个属性即可
能说下你们的解决方案不!分享下哈!或者邮件 沟通  jspp@qq.com


我们后来的解决方法绕开了多数据源事务的问题。
如果您非要使用多数据源的事务,你可以google搜索一下吧,很多的~
7 楼 干宝周 2014-07-29  
liubey 写道
handong890 写道
liubey 写道
handong890 写道
你如果用spring
完全不需要这样做,你只需要实现spring提供一个抽象类AbstractRoutingDataSource 即可完成多数据配置,并且可以在代码逻辑中切换数据源


你说的是“在代码逻辑中切换数据源”显然没有这个注解的更简洁,LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来



你可以在代码中切换数据源
也可以配置AOP规则自动切换,也可以自己加注解实现功能
比如 读写分离我们的规则是  queryXXX方法到指定库 其它方法到什么库。我只是告诉你SPRING 本来就有RoutingDataSource,没必要重复制造轮子



LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来
看清再回复,谢谢,这不是bug,别那么急


@liubey 你懂我~
6 楼 liubey 2014-07-08  
handong890 写道
liubey 写道
handong890 写道
你如果用spring
完全不需要这样做,你只需要实现spring提供一个抽象类AbstractRoutingDataSource 即可完成多数据配置,并且可以在代码逻辑中切换数据源


你说的是“在代码逻辑中切换数据源”显然没有这个注解的更简洁,LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来



你可以在代码中切换数据源
也可以配置AOP规则自动切换,也可以自己加注解实现功能
比如 读写分离我们的规则是  queryXXX方法到指定库 其它方法到什么库。我只是告诉你SPRING 本来就有RoutingDataSource,没必要重复制造轮子



LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来
看清再回复,谢谢,这不是bug,别那么急
5 楼 handong890 2014-07-08  
liubey 写道
handong890 写道
你如果用spring
完全不需要这样做,你只需要实现spring提供一个抽象类AbstractRoutingDataSource 即可完成多数据配置,并且可以在代码逻辑中切换数据源


你说的是“在代码逻辑中切换数据源”显然没有这个注解的更简洁,LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来



你可以在代码中切换数据源
也可以配置AOP规则自动切换,也可以自己加注解实现功能
比如 读写分离我们的规则是  queryXXX方法到指定库 其它方法到什么库。我只是告诉你SPRING 本来就有RoutingDataSource,没必要重复制造轮子
4 楼 liubey 2014-07-08  
7454103 写道
猜测原因可能是 mybatis 自动生成Mapper类时,使用了CGLIB。 但是在spring再对这个interface进行代理时,必须用JDK默认的proxy才行。。所以这里可能会有冲突
-------------- Spring使用哪个作为代理 在你的配置文件内可以指定的!
<aop:aspectj-autoproxy proxy-target-class="true"/>  试试这个配置


如果这个service有@Transaction注解时,也不能使用这种方法。。。 这好像是Spring的一个bug,使用Transaction时,只会使用默认的dataSource
(已经由组内其他同事解决了。)

这个问题也可以解决!事务方法的 datasoruce也是可以指定的!
@DataSourceChange 加个属性即可
能说下你们的解决方案不!分享下哈!或者邮件 沟通  jspp@qq.com



@Transactional可以指定具体事务transactionManager,不知道LZ是不是这么解决的
3 楼 liubey 2014-07-08  
handong890 写道
你如果用spring
完全不需要这样做,你只需要实现spring提供一个抽象类AbstractRoutingDataSource 即可完成多数据配置,并且可以在代码逻辑中切换数据源


你说的是“在代码逻辑中切换数据源”显然没有这个注解的更简洁,LZ也应该用AbstractRoutingDataSource了吧,只是没表示出来
2 楼 handong890 2014-07-06  
你如果用spring
完全不需要这样做,你只需要实现spring提供一个抽象类AbstractRoutingDataSource 即可完成多数据配置,并且可以在代码逻辑中切换数据源
1 楼 7454103 2014-07-06  
猜测原因可能是 mybatis 自动生成Mapper类时,使用了CGLIB。 但是在spring再对这个interface进行代理时,必须用JDK默认的proxy才行。。所以这里可能会有冲突
-------------- Spring使用哪个作为代理 在你的配置文件内可以指定的!
<aop:aspectj-autoproxy proxy-target-class="true"/>  试试这个配置


如果这个service有@Transaction注解时,也不能使用这种方法。。。 这好像是Spring的一个bug,使用Transaction时,只会使用默认的dataSource
(已经由组内其他同事解决了。)

这个问题也可以解决!事务方法的 datasoruce也是可以指定的!
@DataSourceChange 加个属性即可
能说下你们的解决方案不!分享下哈!或者邮件 沟通  jspp@qq.com

相关推荐

    Spring多数据源分布式事务管理

    在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...

    Spring多数据源配置

    Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

    mybatis spring 多数据源

    标题 "mybatis spring 多数据源" 涉及到的是在Java开发中,如何使用MyBatis和Spring框架来管理多个数据库连接。这通常在需要处理来自不同数据源的数据或者实现数据库读写分离的场景下应用。MyBatis是一个优秀的持久...

    基于Spring多数据源实例

    本文将深入探讨如何在一个基于Spring框架的应用中实现多数据源的动态切换,以"基于SSI+Oracle架构的多数据源动态切换实例"为例进行详细讲解。 首先,我们需要理解什么是多数据源。多数据源是指在一个应用中同时连接...

    Spring多数据源解决方案

    Spring多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...

    spring多数据源动态切换方案

    在企业级应用开发中,Spring框架的广泛使用使得数据源管理变得尤为重要,特别是在处理多数据库环境时。"Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了...

    spring多数据源.rar

    本资源"spring多数据源.rar"聚焦于Spring框架如何处理多个不同的数据源,这对于需要连接到多个数据库的应用程序至关重要。下面将详细介绍Spring多数据源的配置和使用。 首先,我们需要理解“多数据源”这一概念。在...

    spring多数据源的处理_mybatis实现跨库查询

    "Spring 多数据源处理_Mybatis 实现跨库查询" 本文主要讨论了 Spring 框架中多数据源的处理方法,特别是使用 Mybatis 实现跨库查询。在大型应用中,为了提高系统的水平伸缩性,需要对数据进行切分,并且采用多个...

    Spring多数据源atomikos所有jar包

    接下来,描述中提到的"Spring多数据源atomikos所有jar包.pdf"很可能是包含详细的步骤和配置示例的文档,这份文档可能涵盖了如何在Spring项目中添加和配置Atomikos的jar包,以及如何进行多数据源的设置。通常,我们...

    基于注解的Spring多数据源配置和使用

    ### 基于注解的Spring多数据源配置与使用详解 #### 一、引言 在企业级应用开发中,经常会遇到需要从多个数据库拉取数据的情况,比如进行跨库查询、定时任务中的数据分析及报表统计等。Spring框架作为Java开发领域的...

    Spring多数据源配置_分布式数据

    ### Spring多数据源配置与分布式数据管理 #### 环境及框架介绍 在本案例中,我们将探讨如何在基于Tomcat服务器的环境下配置多个数据源,并实现分布式数据的交互。该系统的架构主要包括:Tomcat作为应用服务器,...

    spring多数据源 创建 切换使用

    总结,Spring多数据源的创建和切换主要涉及数据源的配置、动态数据源路由以及业务中的数据源切换操作。通过这种方式,我们可以灵活地在不同数据源之间进行切换,满足复杂业务场景的需求。在实际项目中,要注意线程...

    spring多数据源的实现

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,而随着业务复杂性的增加,往往需要处理来自多个数据源的数据。"Spring多数据源的实现"是一个关键的...

    Spring配置多个数据源

    Spring框架提供了一种灵活的方式来配置和管理多个数据源,使得这种需求变得简单易行。本文将详细介绍如何在Spring应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储...

    spring 动态多数据源配置代码

    下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...

Global site tag (gtag.js) - Google Analytics