Spring动态切换数据源
2013-12-31 11:44
302 查看
基于Spring3MVC模式的项目框架,配置动态数据源步骤如下:
一、新建数据源常量类
此类中的常量是通过spring-db.xml映射对应的,我这里配置了两个数据源,代码如下:
二、配置spring-db.xml
这个spring链接数据库的配置文件,需要配置的代码如下:
三、动态数据源设置
这个类是用来切换数据源,再获取jdbcTemplate的管理类,代码如下:
四、测试动态数据源
我这里是用的Junit4做的单元测试,代码如下:
本文出自 “让希望不再失望!” 博客,请务必保留此出处http://peterz2011.blog.51cto.com/3186140/1347038
一、新建数据源常量类
此类中的常量是通过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
相关文章推荐
- Spring 配置多个数据源,并实现动态切换
- Spring动态切换数据源(20170221)
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法(转)
- Spring AbstractRoutingDataSource 实现动态数据源切换
- 关于Spring3 + Mybatis3整合时,多数据源动态切换的问题
- Spring实现动态数据源切换
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring 配置多个数据源,并实现动态切换
- Spring整合多数据源实现动态切换的实例讲解
- 利用AbstractRoutingDataSource实现动态数据源切换 (一、Spring+Hibernate)
- 利用spring+ibatiS技术,在spring中配置多个数据源,并实现动态切换。
- SPRINGAOP实现基于注解的数据源动态切换(转)
- spring动态切换数据源
- 利用AbstractRoutingDataSource实现动态数据源切换 (Spring+Hibernate)
- 动态切换数据源(spring+hibernate)
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring + Mybatis 项目实现动态切换数据源实例详解
- Spring整合Mybatis实现动态数据源切换教程配置
- spring动态切换数据源
- springboot动态切换数据源