摘自:http://blog.csdn.net/yczz/article/details/5893878
在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。
采用spring的AbstractRoutingDataSource就可以简单的解决这个问题。
AbstractRoutingDataSource实现了javax.sql.DataSource接口,因此可以理解为一个虚拟的动态DataSource,在需要的时候根据上下文Context动态决定使用哪个数据源。
下面是一个完整的配置:
- <beans xmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns:aop="http://www.springframework.org/schema/aop"
-
xmlns:tx="http://www.springframework.org/schema/tx"
-
xmlns:jee="http://www.springframework.org/schema/jee"
-
xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
-
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
-
-
-
-
<jee:jndi-lookup id="ds0" jndi-name="jdbc/ds0"/>
-
<jee:jndi-lookup id="ds1" jndi-name="jdbc/ds1"/>
-
<jee:jndi-lookup id="ds2" jndi-name="jdbc/ds2"/>
-
-
<bean id="dataSource" class="com.xxx.xxx.util.DynamicDataSource">
-
<property name="targetDataSources">
-
<map key-type="java.lang.String">
-
<entry key="0" value-ref="ds0"/>
-
<entry key="1" value-ref="ds1"/>
-
<entry key="2" value-ref="ds2"/>
-
</map>
-
</property>
-
<property name="defaultTargetDataSource" ref="1"/>
-
</bean>
-
-
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
-
<property name="dataSource" ref="dataSource"/>
-
<property name="configLocation" value="classpath:com/xxx/xxx/dao/sqlmap/sql-map-config.xml"/>
-
</bean>
-
<bean id="testDAO" class="com.xxx.xxx.dao.impl.TestDAO">
-
<property name="sqlMapClient" ref="sqlMapClient"/>
-
</bean>
-
<bean id="testService" class="com.xxx.xxx.service.impl.TestService">
-
<property name="testDAO" ref="testDAO"/>
-
</bean>
- </beans>
其核心是DynamicDataSource,代码如下
- package com.xxx.xxx.util;
-
-
import org.apache.log4j.Logger;
-
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-
public class DynamicDataSource extends AbstractRoutingDataSource {
-
-
static Logger log = Logger.getLogger("DynamicDataSource");
-
@Override
-
protected Object determineCurrentLookupKey() {
-
-
return DbContextHolder.getDbType();
- }
-
- }
上下文DbContextHolder为一线程安全的ThreadLocal,如下
- package com.xxx.xxx.util;
-
-
public class DbContextHolder {
-
private static final ThreadLocal contextHolder = new ThreadLocal();
-
-
public static void setDbType(String dbType) {
- contextHolder.set(dbType);
- }
-
-
public static String getDbType() {
-
return (String) contextHolder.get();
- }
-
-
public static void clearDbType() {
- contextHolder.remove();
- }
- }
sql-map-config.xml如下
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
-
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
-
- <sqlMapConfig>
-
-
<sqlMap resource="com/xxx/xxx/dao/sqlmap/Object.xml"/>
-
- </sqlMapConfig>
这样在调用service之前只需要设置一下上下文即可调用相应的数据源,如下:
- DbContextHolder.setDbType("2");
-
-
dao如下
- package com.xxx.xxx.dao.impl;
-
-
import java.util.HashMap;
-
import java.util.List;
-
import java.util.Map;
-
-
import org.apache.log4j.Logger;
-
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
-
-
import com.xxx.xxx.vo.TestObj;
-
-
public class TestDAO extends SqlMapClientDaoSupport implements ITestDAO {
-
-
static Logger log = Logger.getLogger(TestDAO.class);
-
-
public TestObj getTestObj(String objID) throws Exception {
-
return (TestObj) getSqlMapClientTemplate().queryForObject("getTestObj", objID);
- }
- }
分享到:
相关推荐
是不是好东西你们去鉴定,SpringMVC + Spring + ibatis 可以配置多数据源,这个Demo 扩展性极强,就看你们自己如何发挥。
Spring+DWR+ibatis+jQuery+easyUI的框架例子. 完全开放源代码,免费学习与使用。 可以完成基本的后台主界面,报表查询,数据查询,增加,修改等功能。 如果你要做一些报表,后台功能利用这个a框架就可以很方便实现。
Spring+iBatis+JOTM实现JTA事务 spring ibatis jotm 分布 事务 多数据源
这是我刚学习开发时总结下来的,Spring多个数据源管理,与大家一起分享
使用Ibatis,Spring,Structs整合做的一个小例子,可以根据不同类型数据库和数据源进行数据表建立和修改,测试无问题。
整合了ibatis和spring 采用了数据源的配置 ibatis有详细的解释
spring,myibatis,配置文件,数据源,web工程
corbarclient+spring+ibatis多数据源切换
集成Spring与 iBATIS框架技术构建基于 J2EE的 WEB应用可以提高 J2EE项目的可重用性.以轻量级 J2EE架构为基础,提出基于 SpringMVC+iBATIS框架的一种 WEB应用,并以生物信息数据库平台设计为例.实践证明,该系统具有良好...
struts spring2 ibatis整合代码实例 已经配置好的。数据库也配置好了。 可以适合mysql主从配置多个数据源的。
资源内容: 1,企业高并发的成熟解决方案资料和笔记;2,数据库高并发原理+演示+说明资料和笔记 其中,第一部分内容有:高并发解决方案;...多数据源支持数据分片的项目示例源代码(spring+ibatis);
如何在spring框架中解决多数据源的问题.pdf
使用struts2(json-plugin) + spring2 + ibatis2 + extjs2.2 + mysql5.0架构开发的图书管理系统,对学习struts2,json-plugin,spring2,ibatis2, ...* 部署时,注意修改相应的数据源配置applicationContext-common.xml
SSM多数据源分包
基于maven的简单的ssi项目。集成spring+strut+ibatis,同时顺带做了下动态数据源的切换。
SSM多数据源同包
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...
11.2 为其他数据源使用DAO模式 203 11.2.1 示例:为LDAP使用DAO 203 11.2.2 示例:为Web服务使用DAO 208 11.3 使用Spring DAO 209 11.3.1 编写代码 209 11.3.2 为什么使用Spring代替iBATIS 211 11.4 创建自己的DAO层...
配置子报表数据源 14.7.5. 配置Exporter的参数 15. 集成其它Web框架 15.1. 简介 15.2. 通用配置 15.3. JavaServer Faces 15.3.1. DelegatingVariableResolver 15.3.2. FacesContextUtils 15.4. Struts 15.4.1. ...
3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ...