码迷,mamicode.com
首页 > 编程语言 > 详细

mybatis+springmvc 多数据源切换

时间:2016-04-27 10:47:44      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

题外话:有n个小系统,现在需要用一个系统监控这n个系统中的数据。解决方案可以是把n个小系统中的数据都同步到一个大的数据库中,然而,这个并不是最佳解决办法。

      我现在碰到一个问题,就是类似这样。每个小系统的数据表,字段、字段类型完全一样,实体类也是一样的,于是,我就想到用mybatis的多数据源切换来解决,由于这种用法并不常见。能在网上找的资料甚少,于是,查找API、源码,终于功夫不负有心人,找到了一种比较稳定的解决办法,写文以记之。

 

1、首先需要写出这n个数据源的配置,(这里以阿里巴巴的数据库连接池为例,dbcp的连接池我试过也是可以的)

<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> 
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        
        <property name="maxActive" value="${dbcp.maxActive}" />
        <property name="maxIdle" value="${dbcp.maxIdle}" />
        
        <property name="filters" value="stat,log4j" />  
        <property name="proxyFilters">
            <list>
                 <ref bean="stat-filter" />
                 <ref bean="log-filter" />
            </list>
        </property>
                
        <property name="removeAbandoned" value="true"></property>
        <property name="removeAbandonedTimeout" value="${dbcp.removeAbandoned}"></property>
        <property name="connectionProperties"><value>clientEncoding=UTF8</value></property>
        
        <property name="testWhileIdle"><value>true</value></property>
        <property name="testOnBorrow"><value>false</value></property>
        <property name="testOnReturn"><value>false</value></property>
        <property name="validationQuery"><value>select sysdate from dual</value></property>
        <property name="validationQueryTimeout"><value>1</value></property>
        <property name="timeBetweenEvictionRunsMillis"><value>30000</value></property>
        <property name="numTestsPerEvictionRun"><value>20</value></property>
    </bean>

如此重复的配置n个不同的数据源,以供切换。

2、数据源配置

<bean id="dataSource" class="com.xxx.common.spring.RoutingDataSourceSupport"> 
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="dataSource1" value-ref="dataSource1"/><!-- 如此重复的配置n个需要切换的数据源 -->
                ...
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSource1"></property><!-- 设置默认的数据源 -->
    </bean>

3、RoutingDataSourceSupport方法

package com.xxx.common.spring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class RoutingDataSourceSupport extends AbstractRoutingDataSource {
    /** 日志句柄 */
    private static Logger logger = LoggerFactory.getLogger(RoutingDataSourceSupport.class);
    private final static ThreadLocal<String> dataSourceKey = new ThreadLocal<String>();

    /**
     * @param key
     *         设置当前的数据源
     */
    public static void setDataSource(String key) {
        dataSourceKey.set(key);
    }


    /**
     * 恢复默认的数据源
     */
    public static void clearDataSource() {
        dataSourceKey.set(null);
    }
    
    protected Object determineCurrentLookupKey() {
        String key = dataSourceKey.get();
        logger.info("当前数据源:"+key);
        return key;
    }
}

4、如何使用?

RoutingDataSourceSupport.setDataSource(dataSource);
// 需要执行数据源切换的位置
do something....
RoutingDataSourceSupport.clearDataSource();

 

后记,也可以不使用

RoutingDataSourceSupport.clearDataSource();而直接使用
RoutingDataSourceSupport.setDataSource(null);

mybatis+springmvc 多数据源切换

标签:

原文地址:http://www.cnblogs.com/mini-firework/p/5437843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!