01:在project中配置多个数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
</property>
<property name="url" value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards">
</property>
<property name="username" value="youguess"></property>
<property name="password" value="youguess"></property>
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
</property>
<property name="url" value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards">
</property>
<property name="username" value="youguess"></property>
<property name="password" value="youguess"></property>
</bean>
02写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法
package com.qingce.appweb.java.control.datasource;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
}
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
}
03:利用ThreadLocal解决线程安全问题
package com.zbb.core.util;
public class CustomerContextHolder {
public static final String DATA_SOURCE_A = "dataSource";
public static final String DATA_SOURCE_B = "dataSource2";
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
04:再次配置数据源
<bean id="dynamicDataSource" class="com.zbb.core.util.DynamicDataSource" >
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="dataSource" key="dataSource"></entry>
<entry value-ref="dataSource2" key="dataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource" >
</property>
</bean>
05:daoImpl中调用
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
或
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_A);
参考学习
http://www.cnblogs.com/davidwang456/p/4318303.html
分享到:
相关推荐
在Spring框架中,多数据源切换是一个常见的需求,特别是在大型分布式系统中,可能需要根据不同的业务逻辑或条件访问不同的数据库。`AbstractRoutingDataSource` 是Spring提供的一种动态数据源解决方案,它允许我们在...
综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...
【Spring 动态数据源切换】使用 `AbstractRoutingDataSource` 的详细实现在处理多数据库环境时,Spring 提供了一个强大的工具 `AbstractRoutingDataSource`,它允许我们根据特定条件动态地切换数据源。本文将深入...
创建一个自定义的数据源切换注解,比如`@SwitchDataSource`,并在需要切换数据源的方法上使用。通过AspectJ的切面处理,我们可以在方法执行前后动态改变ThreadLocal中的数据源引用。 3. **Spring Cloud Config ...
"Spring动态切换多数据源Demo"是一个示例项目,它展示了如何在Spring中实现灵活的数据源切换。 首先,我们需要了解Spring中的数据源。在Spring中,数据源(DataSource)是Java中定义的javax.sql.DataSource接口的...
Spring框架提供了多种方式来处理多数据源问题,其中`AbstractRoutingDataSource`是一个非常实用的解决方案。本文将详细解析如何利用`AbstractRoutingDataSource`来解决多数据源的问题。 `AbstractRoutingDataSource...
- AOP切面的Java类,实现了方法执行前后的拦截和数据源切换。 - 数据源相关的Java配置类,用于配置Spring的DataSource和MybatisPlus。 - Mapper接口和对应的XML文件,定义数据库操作。 - 业务逻辑层的Java类,其中的...
通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...
总的来说,Spring整合MyBatis的多数据源切换是解决复杂数据库应用场景的有效手段。通过灵活的数据源路由,我们可以轻松地实现读写分离、数据库分片等高级架构,提升系统的可扩展性和性能。理解并掌握这一技术对于...
"Mybatis+Spring+SpringMVC+quartz多数据源切换"的架构设计就是为了满足这样的场景。这个项目结合了四个关键的技术组件,它们分别是Mybatis、Spring、SpringMVC和Quartz,下面将详细介绍这些技术以及它们在多数据源...
在企业级应用开发中,Spring框架的广泛使用使得...通过这种方式,我们可以灵活地处理复杂的数据源切换场景,适应不同业务的需求。在实际项目中,还需要考虑线程安全、异常处理、测试等方面的问题,确保系统稳定运行。
总结起来,利用Spring的`AbstractRoutingDataSource`解决多数据源问题的关键在于自定义一个继承自`AbstractRoutingDataSource`的类,实现数据源的选择逻辑,以及使用`ThreadLocal`保持线程上下文。配合AOP,可以在...
Spring提供了AbstractRoutingDataSource类,允许我们根据某种规则(如事务、请求上下文等)动态切换数据源。我们需要扩展这个类,并实现determineCurrentLookupKey方法来决定当前应该使用哪个数据源。 接着,描述中...
2. 使用`AbstractRoutingDataSource`实现动态数据源切换 创建一个继承自`AbstractRoutingDataSource`的类,通过设置当前数据源上下文来实现数据源的切换: ```java @Component public class DynamicDataSource ...
- 在生产环境中,需要确保数据源切换的正确性,可以使用监控工具(如Spring Actuator)跟踪数据源切换情况,同时编写单元测试和集成测试确保功能正常。 综上所述,Spring动态切换数据源是通过配置不同数据源,结合...
在Spring Boot应用中,数据源切换是一个常见的需求,特别是在分布式系统或者微服务架构中,可能需要连接多个数据库来实现不同的业务功能。本示例“spring boot数据源切换demo”将展示如何在Spring Boot中集成MyBatis...
在 `thc-datasources` 压缩包中,可能包含了更详细的配置示例、数据源切换注解的实现以及相关的辅助工具类,如 `DynamicDataSourceContextHolder`。读者可以结合这些资源,进一步理解和实践多数据源动态切换的实现。
本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...
在Spring中,我们可以通过DataSourceProxy和AbstractRoutingDataSource来实现多数据源的切换。DataSourceProxy是Spring的一个代理类,它可以对数据源进行包装,以便在执行SQL语句前决定使用哪个数据源。...
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。