多数据源的动态调用是现在很多复杂系统都会出现的,spring提供了AbstractRoutingDataSource抽象类,可以实现动态数据库的调用。
查看这个类的代码getConnection()获取数据库连接,通过determineTargetDataSource()方法,这个方法实现通过了determineCurrentLookupKey()的抽象方法在子类实现,所以我们继承AbstractRoutingDataSource类,实现determineCurrentLookupKey()方法即可。
抽象类中的方法定义如下
protected DataSource determineTargetDataSource() {
Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
Object lookupKey = determineCurrentLookupKey();
//要注意的是resolvedDataSources是个Map,所以应该在配置文件里初始化个map,其中key才是我们要在子方法里返回的值
DataSource dataSource = this.resolvedDataSources.get(lookupKey);
if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
dataSource = this.resolvedDefaultDataSource;
}
if (dataSource == null) {
throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
}
return dataSource;
}
代码如下新建DynamicDatasource类
public class DynamicDatasource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
String name = DBContextHandler.getDB();
if(name == null){
name = "mysql"; //默认mysql数据库
}
return name;
}
}
创建辅助类DBContextHandler,通过ThreadLocal存储每个线程的唯一数据库名称
public class DBContextHandler {
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
public static String getDB(){
return tl.get();
}
public static void setDB(String dbName){
tl.set(dbName);
}
public static void removeDB(){
tl.remove();
}
}
配置文件如下,同时可以控制事物
<bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="username"><value>XXXX</value></property>
<property name="password"><value>XXXX</value></property>
<property name="url"><value>XXXX</value></property>
</bean>
<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="username"><value>XXXX</value></property>
<property name="password"><value>XXXX</value></property>
<property name="url"><value>XXXX</value></property>
</bean>
<bean id="dynamicDataSource" class="dynamic.datasource.DynamicDatasource">
<property name="targetDataSources">
<map>
<entry value-ref="mysqlDataSource" key="mysql"></entry>
<entry value-ref="oracleDataSource" key="oracle"></entry>
</map>
</property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dynamicDataSource"></property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dynamicDataSource"></property>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="add">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>demoService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<bean id="demoDao" class="dao.DemoDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="demoService" class="service.DemoService">
<property name="demoDao" ref="demoDao"></property>
</bean>
分享到:
相关推荐
2. **Spring多数据源实现方式**: Spring可以通过XML配置或Java配置来实现多数据源。Java配置更符合现代开发习惯,也更易于理解和维护。 3. **核心组件**: - `AbstractRoutingDataSource`:这是Spring提供的核心...
以上是一个基本的Spring多数据源实现流程。在实际项目中,你可能还需要考虑其他因素,如事务的隔离级别、读写分离、数据源的负载均衡等。此外,标签中的"源码"提示,你可以查看相关项目的源码来加深理解,而"工具"则...
在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...
通过以上步骤,我们可以成功地在Spring应用中实现多数据源配置,灵活地管理和切换不同的数据库。这在大型分布式系统中尤其有用,能帮助我们构建更加健壮、高效的数据库访问架构。在实际项目中,还可以结合Spring ...
SpringBoot实现多数据源主要依靠Spring的`@Configuration`和`@DataSourceConfiguration`注解,以及Spring JDBC的`DataSource`接口。下面是一个基本的配置示例: ```java @Configuration public class ...
本文将深入探讨如何在一个基于Spring框架的应用中实现多数据源的动态切换,以"基于SSI+Oracle架构的多数据源动态切换实例"为例进行详细讲解。 首先,我们需要理解什么是多数据源。多数据源是指在一个应用中同时连接...
在Spring中,我们可以通过DataSourceProxy和AbstractRoutingDataSource来实现多数据源的切换。DataSourceProxy是Spring的一个代理类,它可以对数据源进行包装,以便在执行SQL语句前决定使用哪个数据源。...
标题 "mybatis spring 多数据源" 涉及到的是在Java开发中,如何使用MyBatis和Spring框架来管理多个数据库连接。这通常在需要处理来自不同数据源的数据或者实现数据库读写分离的场景下应用。MyBatis是一个优秀的持久...
通过以上步骤,我们就完成了Spring Boot的多数据源配置,实现了从数据源配置、实体管理、Mapper到Controller的完整业务流程。在实际开发中,可以根据具体需求进行调整,例如增加事务管理、数据源切换策略等。
- **`class`**: 指定数据源实现类。 - **`driverClassName`**: 数据库驱动类名。 - **`url`**: 数据库连接地址。 - **`username`**: 数据库登录用户名。 - **`password`**: 数据库登录密码。 ##### 2. Hibernate ...
通过这样的方式,Spring的动态数据源实现为开发者提供了极大的便利,使得在多数据库环境中编写代码变得更加简单和灵活。在实际项目中,我们还可以结合Spring的事务管理、AOP切面等特性,实现更加复杂的数据源切换...
为了实现多数据源处理,我们需要定义一个动态数据源类,继承 AbstractRoutingDataSource,并实现方法 determineCurrentLookupKey,该方法返回一个 Object,一般是返回字符串。然后,我们需要建立一个获得和设置上...
在Spring Boot 2框架中,实现多数据源的配置是一项重要的任务,特别是在大型企业级应用中,可能需要连接到不同的数据库来满足不同业务的需求。在这个项目中,我们有两个主要的数据访问技术:Hibernate和MyBatis,...
本文将深入探讨如何使用Spring Boot的AOP注解方式来实现多数据源的集成。 首先,我们要了解Spring Boot的基础概念。Spring Boot简化了Spring应用程序的创建,它提供了自动配置、起步依赖等特性,使得开发者可以快速...
本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...
在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论多数据源回滚策略。以下是对这些知识点的详细说明: 1. **动态数据源切换**: - 通过AspectJ实现数据源的动态切换,可以设置在...
本示例将探讨如何在Spring和Hibernate环境中实现多数据源的配置与管理。 首先,我们来看标题"Spring+Hibernate多数据源",这意味着我们要在一个项目中同时配置和使用两个数据源。通常,这涉及到创建两个不同的...
以下是一个Spring实现多数据源的简单例子: ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final Logger log = Logger.getLogger("DynamicDataSource"); @...
Spring框架提供了一种灵活的方式来配置和管理多个数据源,使得这种需求变得简单易行。本文将详细介绍如何在Spring应用中配置多个数据源。 首先,我们来理解数据源(DataSource)的概念。数据源是Java中用于存储...
- **BasicDataSource**: Spring内置的`org.springframework.jdbc.datasource.BasicDataSource`是最常用的数据源实现,它基于Apache Commons DBCP库,提供连接池功能。 - **DataSourceTransactionManager**: 这是...