首页 > 编程语言 > 详细

Spring多数据源的配置与使用

时间:2014-03-28 14:57:33      阅读:400      评论:0      收藏:0      [点我收藏+]

从单数据源转变到多数据源的环境,应用程序面临的其中一个问题是,不同的模块对应不同的数据源,如何透明地使用不同的数据源,达到程序的最小改动。

Spring框架提供了自定义数据源路由功能,可以根据规则获取不同的数据源。

实现思路:参考Oliver Gierke在stackoverflow上的回复

 剽窃一张图片说明一下(原文链接),图片中的DynamicDataSource对应下面配置中的dataSource

bubuko.com,布布扣

主要配置:

bubuko.com,布布扣
<!-- 配置两个数据源 -->
    <bean id="dsa" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driver">
            <bean class="com.mysql.jdbc.Driver"></bean>
        </property>
        <property name="url" value="jdbc:mysql://localhost:3306/da" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
    
    <bean id="dsb" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driver">
            <bean class="com.mysql.jdbc.Driver"></bean>
        </property>
        <property name="url" value="jdbc:mysql://localhost:3306/db" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
bubuko.com,布布扣
bubuko.com,布布扣
<!-- 自定义数据源路由规则 -->
    <bean id="dataSource" class="jpa.data.ds.CustomerRoutingDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="a" value-ref="dsa" />
                <entry key="b" value-ref="dsb" />
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dsa" />
    </bean>
bubuko.com,布布扣

这样所有需要数据源的地方统一跟dataSource对象打交道,由它根据规则返回对应的数据源。

 

dataSource实现代码:

bubuko.com,布布扣
public class CustomerRoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return CustomerContextHolder.getName();
    }

}
bubuko.com,布布扣
bubuko.com,布布扣
public class CustomerContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    public static void setName(String name) {
        contextHolder.set(name);
    }

    public static String getName() {
        return contextHolder.get();
    }

}
bubuko.com,布布扣

 

透明地使用多数据源:

bubuko.com,布布扣
// 采用Spring+JPA方式实现
    public void find() {
        CustomerContextHolder.setName("a");    // 选择dsa数据源
        User user = userRepository.findOne(1L); // 获取的是dsa数据源
        assertNotNull(user);
        
        CustomerContextHolder.setName("b");    // 选择dsb数据源
        Photo photo = photoRepository.findOne(1L); // 获取的是dsb数据源
        assertNotNull(photo);
    }
bubuko.com,布布扣

 

参考:

Dynamic DataSource Routing

spring动态创建,加载,使用多数据源

Spring多数据源的配置与使用,布布扣,bubuko.com

Spring多数据源的配置与使用

原文:http://www.cnblogs.com/huangyp/p/3630273.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!