1. 首先在配置文件中配置多个dataSource
2. 扩展Spring的AbstractRoutingDataSource抽象类,实现动态数据源。
AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是实现数据源的route的核心.这里对该方法进行Override。
- publicclass DynamicDataSource extends AbstractRoutingDataSource{
- @Override
- protected Object determineCurrentLookupKey() {
- return DBContextHolder.getDBType();
- }
- }
public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDBType(); } }
上下文DbContextHolder为一线程安全的ThreadLocal,具体代码如下:
- publicclass DBContextHolder{
- publicstaticfinal String DATA_SOURCE_FROM = "dataSourceFrom";
- publicstaticfinal String DATA_SOURCE_TO = "dataSourceTo";
- privatestaticfinal ThreadLocal<String> contextHolder = new ThreadLocal<String>();
- publicstaticvoid setDBType(String dbType) {
- contextHolder.set(dbType);
- }
- publicstatic String getDBType() {
- return contextHolder.get();
- }
- publicstaticvoid clearDBType() {
- contextHolder.remove();
- }
- }
public class DBContextHolder{ public static final String DATA_SOURCE_FROM = "dataSourceFrom"; public static final String DATA_SOURCE_TO = "dataSourceTo"; private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDBType(String dbType) { contextHolder.set(dbType); } public static String getDBType() { return contextHolder.get(); } public static void clearDBType() { contextHolder.remove(); } }
3. 配置动态数据源
将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。
- <bean id="dynamicDataSource"class="datasource.DynamicDataSource" >
- <!-- 通过key-value的形式来关联数据源 -->
- <property name="targetDataSources">
- <map>
- <entry value-ref="dataSourceFrom" key="dataSourceFrom"></entry>
- <entry value-ref="dataSourceTo" key="dataSourceTo"></entry>
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="dataSourceFrom" />
- </bean>
<bean id="dynamicDataSource" class="datasource.DynamicDataSource" > <!-- 通过key-value的形式来关联数据源 --> <property name="targetDataSources"> <map> <entry value-ref="dataSourceFrom" key="dataSourceFrom"></entry> <entry value-ref="dataSourceTo" key="dataSourceTo"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSourceFrom" /> </bean>
4. 使用动态数据源
DynamicDataSource是继承与AbstractRoutingDataSource,而AbstractRoutingDataSource又是继承于org.springframework.jdbc.datasource.AbstractDataSource,AbstractDataSource实现了统一的DataSource接口,所以DynamicDataSource同样可以当一个DataSource使用。
- <!-- JdbcTemplate使用动态数据源的配置 -->
- <bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource">
- <ref bean="dynamicDataSource" />
- </property>
- </bean>
- <!-- 对JdbcTemplate的应用封装类 -->
- <bean id="sqlBaseDAO"class="com.whty.dao.BaseDAOImpl">
- <property name="jdbcTemplate">
- <ref bean="jdbcTemplate" />
- </property>
- </bean>
<!-- JdbcTemplate使用动态数据源的配置 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dynamicDataSource" /> </property> </bean> <!-- 对JdbcTemplate的应用封装类 --> <bean id="sqlBaseDAO" class="com.whty.dao.BaseDAOImpl"> <property name="jdbcTemplate"> <ref bean="jdbcTemplate" /> </property> </bean>5. 动态数据源的管理
如何选择控制每个业务中需要的具体数据源,可是使用手动控制:
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- BaseDAO dao = (BaseDAO) context.getBean("sqlBaseDAO", BaseDAOImpl.class);
- try {
- DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_FROM);
- System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM"));
- DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_TO);
- System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM"));
- } catch (Exception e) {
- e.printStackTrace();
- }
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); BaseDAO dao = (BaseDAO) context.getBean("sqlBaseDAO", BaseDAOImpl.class); try { DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_FROM); System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM")); DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_TO); System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM")); } catch (Exception e) { e.printStackTrace(); }如果在service层有比较统一的规则的话,也可以使用aop设置数据源使用。
6. 这里一般都是一个service一个数据源,所以最好使用aop在service层执行完之后统一调用
- DBContextHolder.clearDBType();
DBContextHolder.clearDBType();清空数据源信息。
当然,在上面配置里面有个参数defaultTargetDataSource为默认数据源,就是不设置数据源的话,就是用这个数据源。
相关推荐
本篇文章将深入探讨如何基于注解和Spring实现多数据源配置和使用。 首先,我们需要理解"注解"在Java中的作用。注解是一种元数据,它提供了一种安全的方法来关联信息和代码(类、方法、变量等)。Spring框架广泛使用...
### Spring 数据源配置详解 #### 一、Spring与数据源简介 在Java企业级应用开发中,数据库操作是必不可少的一部分。Spring框架作为一种流行的轻量级Java应用开发框架,提供了强大的数据库访问支持,其中包括对数据...
Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...
在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...
多数据源配置允许我们灵活地管理这些数据。 SpringBoot实现多数据源主要依靠Spring的`@Configuration`和`@DataSourceConfiguration`注解,以及Spring JDBC的`DataSource`接口。下面是一个基本的配置示例: ```java...
下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...
通过以上步骤,我们可以看到基于Spring的多数据源配置和使用并不复杂。核心思路在于利用`AbstractRoutingDataSource`的灵活性以及`ThreadLocal`来管理数据源标识。这种方式不仅实现了多数据源的动态切换,还保持了...
在Spring Boot应用中,多数据源配置是一项重要的技术实践,特别是在大型系统中,可能需要连接到多个数据库以实现数据隔离、读写分离或是分布式事务管理。Spring Boot以其强大的自动化配置能力,使得设置多数据源变得...
# 主数据源配置 spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db?useSSL=false&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver...
Spring Boot结合JPA(Java Persistence API)和JdbcTemplate,为开发者提供了灵活且强大的多数据源配置能力。本示例将详细介绍如何在Spring Boot项目中实现这样的配置,以支持不同类型的数据库。 首先,我们要理解...
对于需要同时连接多个数据库的应用,Spring支持多数据源配置。可以通过`@Qualifier`注解指定使用哪个数据源,或者使用`AbstractRoutingDataSource`动态路由数据源。 6. **JNDI数据源** 在应用服务器中,数据源...
# Oracle数据源配置 jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:dev jdbc.username=ling jdbc.password=229 # MySQL数据源配置 jdbc-mysql.driver=com.mysql.jdbc.Driver ...
通过以上步骤,你可以在Spring应用中成功配置和使用多个数据源。这使得你的系统更具扩展性和灵活性,能够适应复杂的企业级需求。记住,正确管理和配置数据源对于系统的稳定性和性能至关重要,因此在实际操作时一定要...
### Spring Boot多数据源配置详解 #### 一、引言 在实际的软件开发过程中,随着业务需求的多样化,单一的数据源已经无法满足所有...希望这些内容能够帮助开发者更好地理解和掌握Spring Boot多数据源配置的相关知识。
在Spring Boot和Spring Cloud的背景下,我们可以通过Spring的多数据源配置来实现这一目标。 1. **配置多数据源**:Spring Boot提供了DataSourceAutoConfiguration,它允许我们配置多个数据源。每个数据源可以有自己...
在本教程中,我们将深入探讨如何在Spring Boot项目中配置和使用多数据源以及JdbcTemplate。 首先,让我们了解什么是`JdbcTemplate`。它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java...
阐述spring的数据源配置
在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、...理解并熟练掌握多数据源配置是提升Spring应用灵活性和健壮性的重要一环。