`

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源代码解析

    其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象。在这个上下文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就...

    JAVA OA平台源码(转载)SPRING BOOT....

    【标题】:“JAVA OA平台源码(转载)SPRING BOOT...” 这个开源项目是一个基于Java技术的OA(Office Automation)管理系统的源代码实现,利用了Spring Boot框架进行开发。Spring Boot是Spring生态中的一个核心组件...

    JavaBean实体类 配置文件 代码一键自动生成工具

    *JDBC:选择JDBC是只需要配置数据源就行了,别的不要动 *.table后缀文件:是金蝶BOS中的一个字段属性映射文件 *PDM:Powerdesigner物理逻辑图,选择PDM时会读取物理逻辑图中的所有表,从里面选择需要生成的目标表就...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    spring boot+mybatis整合

    4、在application.yml中添加数据源、Mybatis的实体和配置文件位置。 5、自动生成代码配置文件。 6、建立数据库和表 7、生产Dao层和entity类 8、建立controller层类 9、建立service层类 10、启动之后结果展示 -------...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    Spring 2.5版本引入了更多改进,如支持注解配置、更灵活的AOP、XML Schema-based配置等,增强了应用程序的可维护性和可测试性。 3. **Hibernate3.3**:Hibernate是一个对象关系映射(ORM)框架,它简化了数据库操作...

    SSM整合,参考尚硅谷视频,转载笔记,非原创,侵权删

    - **配置MyBatis**:创建MyBatis的配置文件,包括数据源、事务管理器、Mapper扫描器等,并编写Mapper接口和对应的XML配置文件。 - **编写业务逻辑**:在Service层定义业务逻辑,通过@Autowired注解注入DAO接口,实现...

    JAVA源码 代码一键自动生成工具

    *JDBC:选择JDBC是只需要配置数据源就行了,别的不要动 *.table后缀文件:是金蝶BOS中的一个字段属性映射文件 *PDM:Powerdesigner物理逻辑图,选择PDM时会读取物理逻辑图中的所有表,从里面选择需要生成的目标表就...

    不需要应用服务器的J2EE【转载】

    DataSource是一个接口,用于管理和提供数据库连接,通常由应用服务器提供,但在Spring框架中,可以独立配置。 3. **事务管理**:为了确保数据的一致性,系统使用JTA(Java Transaction API)和JTA/XA事务来处理银行...

    本项目是基于SpringBoot的线上宠物物资购买系统,为个人毕业设计,未经允许禁止转载.zip

    SpringBoot是Java生态系统中的一款流行框架,它简化了Spring应用的初始搭建以及开发过程,提供了“开箱即用”的特性,包括自动配置、内嵌Web服务器(如Tomcat)等,极大地提高了开发效率。 【描述】提到这是个人的...

    转载,若依快速开发框架很不错,详情请看https://www.ruoyi.vip/

    它预配置了许多常见的设置,如嵌入式Tomcat服务器、自动配置的Spring beans等,让开发者可以快速启动项目。 3. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免...

    基于java的二手交易系统

    框架:Spring + Spring MVC + MyBatis 服务器:Tomcat 前端解析框架:Thymeleaf 开发工具:Idea 2017 版本管理工具:Maven 版本控制工具:GitHub 搭建数据库 MySQL driver=com.mysql.jdbc.Driver url=...

    java+Web审批流程.rar

    在【压缩包子文件的文件名称列表】中提到的"java+Web审批流程(转载)"可能是项目的源代码文件、文档或者部署指南。这些文件可能包含以下部分: 1. **源代码**:包括Java源文件(.java),可能分布在不同的包结构下...

    j2ee在线购物网实例源码

    1. **Web-INF**: 这是放置Web应用配置文件的地方,如web.xml(部署描述符),可能还有Spring的配置文件(如applicationContext.xml)和其他库的jar文件。 2. **jsp**或**WEB-INF/views**: 存放JSP(Java Server ...

    pay5160:https的转载者

    启动项目意味着需要进行一系列的开发环境配置,包括但不限于安装必要的Java开发工具(如JDK),克隆或下载源代码,配置项目依赖,最后通过命令行或集成开发环境(IDE)运行项目。在浏览器中调用则表明该项目可能是一...

Global site tag (gtag.js) - Google Analytics