AbstractRoutingDataSource是spring实现的一个数据源,负责动态路由数据源的功能,我们仅需要实现determineCurrentLookupKey()方法即可
一,自定义DataSourceContextHolder
/**
*
* 数据源上下文句柄
* <p>
*
* 在dao或service层通过 {@link #set(String)} 向当前线程设置访问数据源字符串, 由DynamicDataSource类自动调用
*
* @author sunflower
* @see DynamicDataSource
*/
public class DataSourceContextHolder {
private static final ThreadLocal<String> DS_CONTEXT = new ThreadLocal<String>();
/**
* 获取当前线程的数据key 由<code>DynamicDataSource</code>类的
* {@link DynamicDataSource#determineCurrentLookupKey()}使用
*
* @return
*/
public static String get() {
return DS_CONTEXT.get();
}
/**
* 设置数据源key,
*
* @param dataSourceKey
*/
public static void set(String dataSourceKey) {
DS_CONTEXT.set(dataSourceKey);
}
/**
* 移除当前线程中设置的数据源key
*/
public static void remove() {
DS_CONTEXT.remove();
}
}
二,RoutingDataSource的实现
/**
* 动态路由数据源
* <p>
*
* @author sunflower
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* 确定当前选择的数据源key
* <p>
* key由当前线程{@link DataSourceContextHolder#set(String)}
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.get();
}
}
三,定义dao(此略),service
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public List<User> queryRecords(int first, int max, Map condition) {
// 与通常单一数据源的service不一样的是,servce方法中要设置访问的数据库key,
//其他都一样
DataSourceContextHolder.set("nj");
// ....condition.............
}
}
四,配置spring bean 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<bean id="userService" class="org.zkway.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="org.zkway.dao.impl.UserDAOImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="/WEB-INF/config/sql-map-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.zkway.common.util.db.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="nj" value-ref="njDataSource"></entry>
<entry key="bj" value-ref="bjDataSource"></entry>
<entry key="sz" value-ref="szDataSource"></entry>
<entry key="sh" value-ref="njDataSource"></entry>
</map>
</property>
</bean>
<!-- 数据源配置,不同数据源配置-->
<bean id="njDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="详细配置省略"></property>
</bean>
<bean id="shDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="详细配置省略"></property>
</bean>
<bean id="bjDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="详细配置省略"></property>
</bean>
<bean id="szDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="详细配置省略"></property>
</bean>
</beans>
分享到:
相关推荐
### Spring 数据源配置详解 #### 一、Spring与数据源简介 在Java企业级应用开发中,数据库操作是必不可少的一部分。Spring框架作为一种流行的轻量级Java应用开发框架,提供了强大的数据库访问支持,其中包括对数据...
下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...
"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...
Spring多数据源配置,支持mysql、oracle等多个数据源同时存在的情况
在Spring框架中,数据源(DataSource)的配置是应用程序与数据库交互的核心部分。Spring支持多种数据源配置方式,包括基本的JDBC数据源、连接池数据源以及事务管理策略等。下面将详细介绍Spring中常见的数据源配置...
本文将深入探讨如何在SpringBoot项目中配置多数据源,并实现数据源的动态切换,帮助你理解和掌握这一核心技能。 首先,我们理解"多数据源"的概念。在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的...
本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...
阐述spring的数据源配置
在Spring框架中,动态加载配置文件是一项重要的功能,它使得开发者在开发过程中无需重启应用就能实时更新配置,极大地提高了开发效率。热部署方案是这一功能的具体应用,它允许我们在不中断服务的情况下,对应用程序...
2. **配置动态数据源**:在Spring配置文件中,我们需要定义一个`AbstractRoutingDataSource`的子类实例,并为其设置数据源路由表。同时,还需要为每个实际数据源创建一个`DataSource` bean,并将它们添加到路由表中...
在Spring框架中,动态数据源实现是一个重要的特性,它允许应用程序根据特定的条件或用户需求在运行时切换数据源。这种灵活性对于多租户系统、数据隔离或者在不同环境(如开发、测试、生产)之间切换数据库配置尤其...
2. **动态数据源**:Spring的AbstractRoutingDataSource类允许根据特定条件动态选择数据源。通过设置当前数据源键,可以在运行时决定使用哪个数据源。 3. **事务管理**:在多数据源环境中,事务管理需要特别注意。...
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
在Spring Boot应用中,多数据源配置是一项重要的技术实践,特别是在大型系统中,可能需要连接到多个数据库以实现数据隔离、读写分离或是分布式事务管理。Spring Boot以其强大的自动化配置能力,使得设置多数据源变得...
综上所述,Spring动态切换数据源是通过配置不同数据源,结合`AbstractRoutingDataSource`子类和`ThreadLocal`管理的策略,实现在运行时选择合适的数据源执行SQL操作。这一机制极大地增强了系统的灵活性和可扩展性。
Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...
本篇文章将深入探讨如何基于注解和Spring实现多数据源配置和使用。 首先,我们需要理解"注解"在Java中的作用。注解是一种元数据,它提供了一种安全的方法来关联信息和代码(类、方法、变量等)。Spring框架广泛使用...
本示例代码将介绍如何在项目中配置和使用MyBatis-Plus实现多数据源和动态数据源切换。 首先,我们需要理解多数据源的概念。多数据源意味着系统中存在不止一个数据存储,每个数据源可能对应不同的数据库,如MySQL、...