Spring动态切换数据源

基于Spring3MVC模式的项目框架,配置动态数据源步骤如下:

一、新建数据源常量类

   此类中的常量是通过spring-db.xml映射对应的,我这里配置了两个数据源,代码如下:

package com.baofoo.admin.service.sys.data;
/**
 * 数据源的名称常量
 * @author zhour
 *
 */
public class DynamicDataSourceGlobal {
    public static final String DATA_SOURCE_204 = "DATA_SOURCE_204";
    public static final String DATA_SOURCE_108 = "DATA_SOURCE_108";
}


二、配置spring-db.xml

   这个spring链接数据库的配置文件,需要配置的代码如下:

<!-- 数据源相同配置 -->
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="parentDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    </bean>
                                                                                                                  
    <!-- 一下配置多个数据源的特性 -->
    <!-- 数据库:10.0.20.204 -->
    <bean parent="parentDataSource" id="dataSource204">
        <property name="url" value="jdbc:mysql://10.0.20.204:3306/BAOFOO_ADMIN?useUnicode=true&amp;characterEncoding=utf8" />
        <property name="username" value="baofoo" />
        <property name="password" value="baofoo@64" />
    </bean>
    <!-- 数据库:10.0.20.108 -->
    <bean parent="parentDataSource" id="dataSource108">
        <property name="url" value="jdbc:mysql://10.0.20.108:3306/BAOFOO_ADMIN?useUnicode=true&amp;characterEncoding=utf8" />
        <property name="username" value="baofoo" />
        <property name="password" value="baofoo@64" />
    </bean>
                                                                                                                  
    <!-- 映射到相关处理类 -->
    <bean class="com.baofoo.admin.service.sys.data.DynamicDataSource" id="dynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="DATA_SOURCE_204" value-ref="dataSource204"></entry>
                <entry key="DATA_SOURCE_108" value-ref="dataSource108"></entry>
            </map>
        </property>
    </bean>
    <bean id="jdbcTemplateDynamic" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dynamicDataSource" />
    </bean>


三、动态数据源设置

   这个类是用来切换数据源,再获取jdbcTemplate的管理类,代码如下:

package com.baofoo.admin.service.sys.data;
import org.springframework.util.Assert;
/**
 * 动态数据源设置
 * @author zhour
 *
 */
public class DynamicDataSourceHolder {
    /**
     * 本地环境线程
     */
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
                                                                            
    /**
     * 设置数据源类型
     * @param dataSourceType
     */
    public static void setDataSourceType(String dataSourceType) {
        Assert.notNull(dataSourceType, "数据源不能为空...");
        contextHolder.set(dataSourceType);
    }
                                                                            
    /**
     * 获取数据源类型
     * @return
     */
    public static String getDataSourceType() {
        return (String) contextHolder.get();
    }
                                                                            
    /**
     * 清除数据源类型
     */
    public static void clearDataSourceType() {
        contextHolder.remove();
    }
}


四、测试动态数据源

   我这里是用的Junit4做的单元测试,代码如下:

package com.baofoo.admin.test.dynamicData;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baofoo.admin.service.sys.data.DynamicDataSource;
import com.baofoo.admin.service.sys.data.DynamicDataSourceGlobal;
import com.baofoo.admin.service.sys.data.DynamicDataSourceHolder;
/**
 * 测试动态数据源
 * @author zhour
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:app-context.xml"})
public class TestDynamicData extends AbstractJUnit4SpringContextTests {
    @Autowired
    private JdbcTemplate jdbcTemplateDynamic;
                                 
    @Test
    public void testDynamicData() {
        String sql = "SELECT * FROM BAOFOO_ADMIN.admin_login_user ORDER BY user_id DESC LIMIT 1";
        //数据源204
        DynamicDataSourceHolder.setDataSourceType(DynamicDataSourceGlobal.DATA_SOURCE_204);
        System.out.println("------------>切换数据源到204");
        //
        List<Map<String, Object>> retList2 = jdbcTemplateDynamic.queryForList(sql);
        for(Map<String, Object> entityMap : retList2) {
            System.out.println("-------查询结果:"+entityMap);
        }
                                     
        //数据源108
        DynamicDataSourceHolder.setDataSourceType(DynamicDataSourceGlobal.DATA_SOURCE_108);
        System.out.println("------------>切换数据源到108");
        //
        List<Map<String, Object>> retList1 = jdbcTemplateDynamic.queryForList(sql);
        for(Map<String, Object> entityMap : retList1) {
            System.out.println("-------查询结果:"+entityMap);
        }
    }
}

总结:这种切换比较规范和简单,麻烦的是必须先配置多个数据源,以前是参考网上资料,自己修改的,如有问题请指出。

你可能感兴趣的:(java,切换数据源,spring数据源)