`
foryougeljh
  • 浏览: 116576 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring动态配置多数据源

 
阅读更多

Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况:
  一是,表级上的跨数据库。即,对于不同的数据库却有相同的表(表名和表结构完全相同)。
  二是,非表级上的跨数据库。即,多个数据源不存在相同的表。
Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
  
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。

1. 数据源的名称常量类:

package com.test;
public class DataSourceMap {
public static final String TEST="test";
public static final String LJH="ljh";
}
2. 建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称
package com.test;
public class CustomerContextHolder {
private static final ThreadLocal<String> customer = new ThreadLocal<String>();// 线程本地环境
// 设置数据源类型
public static void setCustomerType(String customerType){
customer.set(customerType);
}
// 获取数据源类型
public static String getCustomerType(){
return customer.get();
}
// 清除数据源类型
public static void remove(){
customer.remove();
}
}
3. 建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串
package com.test;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource{

@Override
protected Object determineCurrentLookupKey() {
// 在进行DAO操作前,通过上下文环境变量,获得数据源的类型
return CustomerContextHolder.getCustomerType();
}
}
4. 编写spring的配置文件配置多个数据源
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 数据源公共的内容 -->
<bean id="abstractDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
</bean>
<!-- 数据库ljh -->
<bean id="ljhDataSource" parent="abstractDataSource" >
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/ljh">
</property>
</bean>
<!-- 数据库test -->
<bean id="testDataSource" parent="abstractDataSource" >
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/test">
</property>
</bean>
<!-- 配置多数据源映射关系 -->
<bean id="dataSource" class="com.test.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="ljh" value-ref="ljhDataSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="testDataSource"></property>
</bean>

<!-- sessionFactory的配置 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<!-- 实体类资源映射 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/test</value>
</list>
</property>
<!-- 为sessionFactory 配置Hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- 为dao配置sessionFactory -->
<bean id="userDaoImpl" class="com.test.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

</beans>
User类
package com.test;
public class User {
private Integer id;
private String name;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
user.hbm.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="com.test.User" table="tuser">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" length="15"></property>
</class>
</hibernate-mapping>

Dao类

package com.test;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class UserDaoImpl extends HibernateDaoSupport{
public void save(User user){
this.getHibernateTemplate().save(user);
}
}

测试类
package com.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

CustomerContextHolder.setCustomerType(DataSourceMap.TEST);
UserDaoImpl userDaoImpl = (UserDaoImpl)ctx.getBean("userDaoImpl");
User user = new User();
user.setName("test");
userDaoImpl.save(user);

CustomerContextHolder.setCustomerType(DataSourceMap.LJH);
user.setName("ljh");
userDaoImpl.save(user);
CustomerContextHolder.remove();

}
}













分享到:
评论

相关推荐

    spring mvc 配置多数据源

    ### Spring MVC 中配置多数据源详解 在Spring框架中配置多数据源的需求比较常见,尤其在需要处理不同类型的数据库或需要实现数据隔离的应用场景中。本文将详细介绍如何在Spring MVC项目中配置并使用多数据源。 ###...

    SpringBoot配置多数据源实现动态切换数据源

    本文将深入探讨如何在SpringBoot项目中配置多数据源,并实现数据源的动态切换,帮助你理解和掌握这一核心技能。 首先,我们理解"多数据源"的概念。在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的...

    spring boot多数据源配置

    2. 配置数据源 在`application.yml`或`application.properties`文件中,为每个数据源定义配置: ```yaml spring: datasource: primary: # 主数据源 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:...

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...

    Spring动态切换多数据源Demo

    总的来说,"Spring动态切换多数据源Demo"是一个实战教程,旨在教你如何在Spring应用程序中实现数据源的动态切换,以及如何处理相关的配置和事务管理。通过学习这个Demo,你可以掌握在Spring环境中处理多数据库连接的...

    spring 动态多数据源配置代码

    下面将详细介绍Spring动态多数据源配置的相关知识点。 1. **为什么要使用多数据源**: 在实际项目中,可能需要连接到不同的数据库,例如,一个用于存储主业务数据,另一个用于日志记录或数据分析。通过多数据源...

    springboot连接池、动态配置多数据源连接池,特别适合大数据部门、数据中台服务的多数据源连接池.zip

    1. **配置数据源**:在`application.properties`或`application.yml`文件中,为每个数据源定义相应的属性,如URL、用户名、密码和驱动类名。 2. **创建数据源bean**:利用@ConfigurationProperties绑定配置文件中的...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    总结来说,Spring Boot + JPA 的多数据源配置需要对Spring的配置机制有深入理解,包括自动配置、bean的创建、数据源的切换等。同时,合理组织实体类和数据库访问层,确保代码的可维护性和扩展性。这个名为`...

    Spring配置多个数据源

    在开发企业级应用程序时,有时我们需要连接到不止一个数据库,比如主从数据库分离、读写分离、多租户系统等场景...记住,正确管理和配置数据源对于系统的稳定性和性能至关重要,因此在实际操作时一定要仔细检查和测试。

    spring数据源配置

    ### Spring 数据源配置详解 #### 一、Spring与数据源简介 在Java企业级应用开发中,数据库操作是必不可少的一部分。Spring框架作为一种流行的轻量级Java应用开发框架,提供了强大的数据库访问支持,其中包括对数据...

    Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...

    Spring Boot使用spring-data-jpa配置Mysql多数据源

    在Spring Boot应用中,使用`spring-data-jpa`来配置MySQL多数据源是一项常见的需求,尤其是在构建大型分布式系统时,为了实现数据隔离、负载均衡或读写分离等目的。本教程将详细介绍如何在Spring Boot项目中配置多个...

    mybatis+spring实现动态切换数据源

    1. **配置Spring**:首先,我们需要在Spring的配置文件中声明多个数据源。这些数据源可以是JDBC的DataSource实例,如Apache的DBCP或C3P0。每个数据源都有其特定的数据库连接信息,例如URL、用户名和密码。 ```xml ...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    3. **配置数据源路由**:为了在代码中动态选择使用哪个数据源,可以使用`AbstractRoutingDataSource`,它可以根据预设的规则或运行时条件决定使用哪个数据源。 4. **配置Hibernate和MyBatis**:为每个数据源配置...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...

    Spring+SpringMVC+Mybatis动态链接多数据源

    1. **配置数据源**:首先,你需要配置多个数据源,可以使用Spring的AbstractRoutingDataSource作为基础,该类可以根据某种路由策略(如线程本地变量、请求参数等)动态选择数据源。 2. **定义路由逻辑**:创建一个...

    spring配置JNDI数据源

    Spring框架作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了多种配置数据源的方式,其中包括通过JNDI(Java Naming and Directory Interface)来查找和配置数据源。...

    spring 动态切换数据源

    在Spring框架中,动态切换数据源是一项重要的功能,它允许应用程序根据业务需求在多个数据库之间灵活切换。这一特性对于多租户系统、读写分离、分布式数据库等场景尤其有用。以下将详细介绍如何实现Spring的动态数据...

    spring整合mybatis多数据源

    1. **配置数据源**:首先,我们需要为每个数据源创建一个单独的DataSource bean。这些数据源可以是JDBC的SimpleDriverDataSource,也可以是其他支持的类型,如Druid或HikariCP。 2. **定义路由规则**:然后,我们...

Global site tag (gtag.js) - Google Analytics