您的位置:首页 > 编程语言 > Java开发

Spring动态切换数据源

2013-12-31 11:44 302 查看
基于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&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&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);
}
}
}
总结:这种切换比较规范和简单,麻烦的是必须先配置多个数据源,以前是参考网上资料,自己修改的,如有问题请指出。
本文出自 “让希望不再失望!” 博客,请务必保留此出处http://peterz2011.blog.51cto.com/3186140/1347038
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: