<!-- 分散配置 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置(主库)数据源 --> <bean id="dataSource-main" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverclass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxPoolSize" value="${c3p0.pool.size.max}" /> <property name="minPoolSize" value="${c3p0.pool.size.min}" /> <property name="initialPoolSize" value="${c3p0.pool.size.ini}" /> <property name="acquireIncrement" value="${c3p0.pool.size.increment}" /> </bean> <!-- 配置从库数据源 --> <bean id="dataSource-1" parent="dataSource-main"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/lsn_surveypark001_1" /> </bean> <!-- 数据源路由器 --> <bean id="dataSourceRouter" class="com.surveypark.datasource.SurveyparkDataSourceRouter"> <!-- 目标数据源集合 --> <property name="targetDataSources"> <map> <entry key="odd" value-ref="dataSource-main" /> <entry key="even" value-ref="dataSource-1" /> </map> </property> <!-- 默认数据源集合 --> <property name="defaultTargetDataSource" ref="dataSource-main" /> </bean>
public class SurveyparkDataSourceRouter extends AbstractRoutingDataSource { protected Object determineCurrentLookupKey() { SurveyparkToken token = SurveyparkToken.getCurrentToken(); if(token != null){ Integer id = token.getSurvey().getId(); SurveyparkToken.unbindToken(); return ((id % 2) == 0) ? "even" : "odd" ; } return null; } }
public class SurveyparkToken { private static ThreadLocal<SurveyparkToken> l = new ThreadLocal<SurveyparkToken>(); private Survey survey ; public Survey getSurvey() { return survey; } public void setSurvey(Survey survey) { this.survey = survey; } public static void bindToken(SurveyparkToken token){ l.set(token); } public static void unbindToken(){ l.remove(); } public static SurveyparkToken getCurrentToken(){ return l.get(); } }
SurveyparkToken token = new SurveyparkToken(); token.setSurvey(getCurrentSurvey()); SurveyparkToken.bindToken(token); surveyService.saveAnswers(processAnswers());
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
相关推荐
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...
1. **Spring的AbstractRoutingDataSource**:这是Spring提供的核心类,用于实现动态数据源切换。这个抽象类维护了一个数据源路由决策表,可以根据特定的规则(如事务上下文、线程局部变量等)来决定使用哪个数据源。...
1. **Spring动态数据源**:Spring框架提供了动态数据源支持,允许我们在运行时根据需求切换或选择不同的数据源。这主要通过`AbstractRoutingDataSource`类实现,该类能够根据某种策略(如事务ID、用户名等)动态决定...
以下将详细介绍如何实现Spring的动态数据源切换以及相关知识点。 1. **数据源配置** - `jdbc.properties`: 这个文件通常包含了数据库连接的相关配置,如URL、用户名、密码、驱动类名等。Spring通过`Properties`类...
在Spring Boot应用中,数据源切换是一个常见的需求,特别是在分布式系统或者微服务架构中,可能需要连接多个数据库来实现不同的业务功能。本示例“spring boot数据源切换demo”将展示如何在Spring Boot中集成MyBatis...
【Spring 动态数据源切换】使用 `AbstractRoutingDataSource` 的详细实现在处理多数据库环境时,Spring 提供了一个强大的工具 `AbstractRoutingDataSource`,它允许我们根据特定条件动态地切换数据源。本文将深入...
"Spring动态切换多数据源Demo"是一个示例项目,它展示了如何在Spring中实现灵活的数据源切换。 首先,我们需要了解Spring中的数据源。在Spring中,数据源(DataSource)是Java中定义的javax.sql.DataSource接口的...
- AOP切面的Java类,实现了方法执行前后的拦截和数据源切换。 - 数据源相关的Java配置类,用于配置Spring的DataSource和MybatisPlus。 - Mapper接口和对应的XML文件,定义数据库操作。 - 业务逻辑层的Java类,其中的...
- **动态数据源切换逻辑**:核心逻辑是在AOP切面的Advice中实现。当一个需要切换数据源的方法被调用时,通过反射或其他机制获取该方法上标注的数据源信息,然后根据这些信息从数据源池中获取对应的数据源,并将其...
- 可以编写单元测试或集成测试,模拟不同场景下的数据源切换,确保功能正确无误。 - 使用日志记录数据源切换的过程,以便于调试和监控。 8. **最佳实践** - 避免在业务代码中直接切换数据源,最好通过服务层的...
在企业级应用开发中,Spring框架的广泛使用使得...通过这种方式,我们可以灵活地处理复杂的数据源切换场景,适应不同业务的需求。在实际项目中,还需要考虑线程安全、异常处理、测试等方面的问题,确保系统稳定运行。
然后,定义一个数据源切换的抽象类或接口,用于封装切换逻辑: ```java public interface DataSourceSwitcher { DataSource switchDataSource(DataSourceType type); } ``` 接着,实现这个接口,基于Spring的`...
在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论多数据源回滚策略。以下是对这些知识点的详细说明: 1. **动态数据源切换**: - 通过AspectJ实现数据源的动态切换,可以设置在...
本文将深入探讨如何在SpringBoot项目中配置多数据源,并实现数据源的动态切换,帮助你理解和掌握这一核心技能。 首先,我们理解"多数据源"的概念。在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的...
在实际项目中,我们还可以结合Spring的事务管理、AOP切面等特性,实现更加复杂的数据源切换策略,以满足各种业务需求。 总的来说,动态数据源是Spring框架中的一项强大功能,它允许我们在不修改代码的情况下,根据...
创建一个自定义的数据源切换注解,比如`@SwitchDataSource`,并在需要切换数据源的方法上使用。通过AspectJ的切面处理,我们可以在方法执行前后动态改变ThreadLocal中的数据源引用。 3. **Spring Cloud Config ...
综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...
本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...
3. **AOP实现动态数据源切换** 使用AOP(面向切面编程)注解,我们可以实现方法级别的数据源切换。创建一个`@Aspect`注解的类,定义一个环绕通知来切换数据源: ```java @Aspect @Component public class ...