`
xiaoliang330
  • 浏览: 115628 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

动态多数据源实现

阅读更多
背景: 目前基于连接了mobile库 从库的 项目(spring+mybatis), 需要将从库配置调整为多个直连数据源,  即 配置多个从库的需要



下面以配置两个mobile从库数据源为例,进行配置示例:



数据源配置文件appContext-jdbc.xml
<!-- mobile 从库 -->

<bean id="mobileReadDataSource0" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="maxPoolSize" value="200" />
<property name="minPoolSize" value="50" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="autoCommitOnClose" value="true" />
<property name="initialPoolSize" value="10" />
<property name="jdbcUrl"
value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&amp;zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true" />
<property name="user" value="${jdbc.mobile.username}" />
<property name="checkoutTimeout" value="5000" />
<property name="password" value="${jdbc.mobile.password}" />
<property name="acquireRetryAttempts" value="30" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
</bean>

<!-- mobile 从库 -->

<bean id="mobileReadDataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="maxPoolSize" value="200" />
<property name="minPoolSize" value="50" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="autoCommitOnClose" value="true" />
<property name="initialPoolSize" value="10" />
<property name="jdbcUrl"
value="jdbc:mysql://${jdbc.mobile.host}:${jdbc.mobile.port}/${jdbc.mobile.dbname}?useUnicode=true&amp;zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true" />
<property name="user" value="${jdbc.mobile.username}" />
<property name="checkoutTimeout" value="5000" />
<property name="password" value="${jdbc.mobile.password}" />
<property name="acquireRetryAttempts" value="30" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
</bean>

<!-- mobile 写主库 -->

<bean id="mobileWriteDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="maxPoolSize" value="200" />
<property name="minPoolSize" value="50" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="autoCommitOnClose" value="true" />
<property name="initialPoolSize" value="10" />
<property name="jdbcUrl"
value="jdbc:mysql://${jdbc.write.mobile.host}:${jdbc.write.mobile.port}/${jdbc.write.mobile.dbname}?useUnicode=true&amp;zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true" />
<property name="user" value="${jdbc.write.mobile.username}" />
<property name="checkoutTimeout" value="5000" />
<property name="password" value="${jdbc.write.mobile.password}" />
<property name="acquireRetryAttempts" value="30" />
<property name="acquireRetryDelay" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
</bean>

<!-- mobile 动态数据源配置,目前是1主2从, 默认连接从库 -->

<bean id="mobileDataSource" class="com.yy.sv.base.db.dynamic.DynamicRoutingDataSource">
<property name="master" ref="mobileWriteDataSource" />
<property name="slaves">
<list>
<ref bean="mobileReadDataSource0" />
<ref bean="mobileReadDataSource1" />
</list>
</property>
<property name="defaultTargetDataSource" ref="mobileReadDataSource0"/>
<!-- <property name="maxFailCount" value="5" /> --> <!--可选配置,设置从库检查maxFailCount次失败后(默认5次),回调处理接口-->
<!-- <property name="HandleFailedPattern" ref="handleFailedPattern" /> --><!--可选配置,业务方实现回调处理接口-->
</bean>



2.  动态数据源工具类 com.yy.sv.base.db.dynamic.DynamicRoutingDataSource

使用该工具类需要依赖jar

<dependency>
<groupId>com.yy.cs</groupId>
<artifactId>sv-base</artifactId>
<version>1.2.1</version>
</dependency>

DynamicRoutingDataSource内部实现了多个数据源间的负载均衡机制(从数据源的bean id名并不作为均衡机制中的key,可以随意命名),想了解的可以读下源码





3.  基于目前默认连接的是从库的配置, 业务代码在需要切换至主库进行写操作时,代码如下:





@Override
public Set<Long> checkReidsInStore(List<Long> resids) {
   DynamicRoutingDataSourceHolder.useMaster();//切换至主库
   Set<Long> residSet = shenquStoreMapper.checkResidsExist(resids);
   DynamicRoutingDataSourceHolder.reset();//切换至默认连接从库
   return residSet;
}







4. 之前代码中已经使用了如下代码的可以这样切换:



@Override
public Set<Long> checkReidsInStore(List<Long> resids) {
  DynamicDataSourceHolder.setDataSourceKey(Constants.MOBILE_DATA_SOURCE_SPRING_BEAD_ID, Constants.WRITE_DATA_SOURCE);
  Set<Long> residSet = shenquStoreMapper.checkResidsExist(resids);
  DynamicDataSourceHolder.clearDataSourceMapKey();
return residSet;
}


将DynamicDataSourceHolder的setDataSourceKey以及clearDataSourceMapKey方法的实现调整为:

public static void setDataSourceKey(String dataSource,String dataSourceKey) {
  DynamicRoutingDataSourceHolder.useMaster();//基于目前默认连从库,切换至主库才需要手动设置dataSourceKey
}

public static void clearDataSourceMapKey() {
  DynamicRoutingDataSourceHolder.reset();
}

这样业务代码中进行主从切换的代码就不需要改动, 减少改动和入侵









5. 如果项目中没有使用到写主库数据源, 那么可以这样配置(紫色部分),因为没有进行过主从切换, 所以用从库数据源顶替主写数据源:



<!-- mobile 动态数据源配置,目前是1主2从, 默认连接从库 -->

<bean id="mobileDataSource" class="com.yy.sv.base.db.dynamic.DynamicRoutingDataSource">
<property name="master" ref="mobileReadDataSource0" />
<property name="slaves">
<list>
<ref bean="mobileReadDataSource0" />
<ref bean="mobileReadDataSource1" />
</list>
</property>
<property name="defaultTargetDataSource" ref="mobileReadDataSource0"/>
<!-- <property name="maxFailCount" value="5" /> --> <!--可选配置,设置从库检查maxFailCount次失败后(默认5次),回调处理接口-->
<!-- <property name="HandleFailedPattern" ref="handleFailedPattern" /> --><!--可选配置,业务方实现回调处理接口-->
</bean>

分享到:
评论

相关推荐

    SpringBoot配置多数据源实现动态切换数据源

    总结来说,SpringBoot实现多数据源和动态切换的关键在于正确配置多个数据源,创建自定义的AOP切面和ThreadLocal上下文。在实际项目中,还需要考虑事务管理、异常处理等复杂情况,确保数据的一致性和安全性。通过理解...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    - **动态数据源切换逻辑**:核心逻辑是在AOP切面的Advice中实现。当一个需要切换数据源的方法被调用时,通过反射或其他机制获取该方法上标注的数据源信息,然后根据这些信息从数据源池中获取对应的数据源,并将其...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    DynamicDataSource是继承自AbstractRoutingDataSource抽象类的动态数据源实现类,该类的作用是根据配置参数创建数据源。DynamicDataSource类中定义了一个etermineCurrentLookupKey方法,该方法用于确定当前的数据源...

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...

    mybatis+spring实现动态切换数据源

    要实现动态数据源,我们需要以下几个步骤: 1. **配置Spring**:首先,我们需要在Spring的配置文件中声明多个数据源。这些数据源可以是JDBC的DataSource实例,如Apache的DBCP或C3P0。每个数据源都有其特定的数据库...

    mybatis-plus多数据源/动态数据源配置示例代码

    本示例代码将介绍如何在项目中配置和使用MyBatis-Plus实现多数据源和动态数据源切换。 首先,我们需要理解多数据源的概念。多数据源意味着系统中存在不止一个数据存储,每个数据源可能对应不同的数据库,如MySQL、...

    Springboot 动态多数据源 jta分布式事务

    本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...

    使用springboot + JPA / MyBatis 实现多数据源动态切换

    4. **动态数据源切换**:对于MyBatis,可以在SqlSessionTemplate中设置数据源,或者使用`@MapperScan`注解配合自定义数据源路由类来实现。 **六、实战项目分析** 在`springboot-multi-datasource-master`项目中,...

    SpringBoot实现动态切换数据源(含源码)

    总结起来,使用`ThreadLocal`和`AbstractRoutingDataSource`实现动态数据源切换的关键步骤包括: 1. 创建`ThreadLocal`实例来保存线程的数据源信息。 2. 实现`AbstractRoutingDataSource`,并重写`...

    动态数据源实现spring

    通过这样的方式,Spring的动态数据源实现为开发者提供了极大的便利,使得在多数据库环境中编写代码变得更加简单和灵活。在实际项目中,我们还可以结合Spring的事务管理、AOP切面等特性,实现更加复杂的数据源切换...

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

    在SpringBoot项目中,整合Mybatis-Plus并实现多数据源的动态切换,同时支持分页查询是一项常见的需求。以下将详细阐述这个过程中的关键步骤和技术要点。 首先,我们需要引入必要的Maven依赖。这里提到了四个关键...

    动态多数据源示例代码

    总的来说,这个项目是关于在SpringBoot应用中实现动态多数据源切换的实例,它涵盖了SpringBoot、MyBatis和Druid的高级用法,以及如何设计和实现动态数据源管理的策略。对于希望了解和掌握这一技术的开发者来说,这是...

    springboot 1.5.9+mybatis动态指定数据源

    在大型分布式系统中,通常需要处理多个数据库,这就涉及到了动态数据源的概念。本文将深入探讨如何在Spring Boot 1.5.9版本中结合MyBatis实现动态指定数据源,并通过自定义注解来实现这一功能。 首先,我们需要理解...

    springboot动态数据源代码实现,动态数据源代码,租户系统动态数据源代码

    项目实现了使用SpringBoot实现动态数据源,实现步骤: 1.租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的...

    spring boot AOP注解方式实现多数据源

    3. **动态数据源**:为了能够在运行时动态选择数据源,我们可以使用`AbstractRoutingDataSource`。这个抽象类会根据当前的上下文(比如方法注解)来决定使用哪个数据源。我们需要覆盖其`determineCurrentLookupKey`...

    Spring+SpringMVC+Mybatis动态链接多数据源

    实现多数据源通常有以下步骤: 1. **配置数据源**:首先,你需要配置多个数据源,可以使用Spring的AbstractRoutingDataSource作为基础,该类可以根据某种路由策略(如线程本地变量、请求参数等)动态选择数据源。 ...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...

    Spring动态切换多数据源Demo

    Spring提供了多种方式来管理多数据源,例如通过`AbstractRoutingDataSource`实现动态数据源切换。这个类可以根据某些条件(如事务的标识、请求上下文等)动态决定使用哪个数据源。在`dynamicDatasourceDemo`项目中,...

    ssm实现多数据源配置

    在实际项目中,有时我们需要访问多个数据库,这时就需要实现多数据源配置。 在SSM框架中实现多数据源配置,主要涉及以下几个关键步骤和知识点: 1. **配置文件设置**:首先,你需要在`applicationContext.xml`或`...

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    Spring Boot通过DataSourceProperties和AbstractRoutingDataSource等组件,可以实现动态数据源的配置。通过编程或配置文件的方式,我们可以设置数据源的优先级、权重以及自动切换规则。 接下来,我们关注如何在...

Global site tag (gtag.js) - Google Analytics