Spring+iBatis多数据源的动态配置方案
来源:互联网 发布:直销奖金结算软件 编辑:程序博客网 时间:2024/05/16 02:32
摘自:http://blog.csdn.net/yczz/article/details/5893878
在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。
采用spring的AbstractRoutingDataSource就可以简单的解决这个问题。
AbstractRoutingDataSource实现了javax.sql.DataSource接口,因此可以理解为一个虚拟的动态DataSource,在需要的时候根据上下文Context动态决定使用哪个数据源。
下面是一个完整的配置:
- <beansxmlns="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">
- <!-- ========================= GENERAL DEFINITIONS ========================= -->
- <jee:jndi-lookupid="ds0"jndi-name="jdbc/ds0"/>
- <jee:jndi-lookupid="ds1"jndi-name="jdbc/ds1"/>
- <jee:jndi-lookupid="ds2"jndi-name="jdbc/ds2"/>
- <beanid="dataSource"class="com.xxx.xxx.util.DynamicDataSource">
- <propertyname="targetDataSources">
- <mapkey-type="java.lang.String">
- <entrykey="0"value-ref="ds0"/>
- <entrykey="1"value-ref="ds1"/>
- <entrykey="2"value-ref="ds2"/>
- </map>
- </property>
- <propertyname="defaultTargetDataSource"ref="1"/>
- </bean>
- <!-- SqlMap setup for iBATIS Database Layer -->
- <beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <propertyname="dataSource"ref="dataSource"/>
- <propertyname="configLocation"value="classpath:com/xxx/xxx/dao/sqlmap/sql-map-config.xml"/>
- </bean>
- <beanid="testDAO"class="com.xxx.xxx.dao.impl.TestDAO">
- <propertyname="sqlMapClient"ref="sqlMapClient"/>
- </bean>
- <beanid="testService"class="com.xxx.xxx.service.impl.TestService">
- <propertyname="testDAO"ref="testDAO"/>
- </bean>
- </beans>
其核心是DynamicDataSource,代码如下
- package com.xxx.xxx.util;
- import org.apache.log4j.Logger;
- import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
- publicclass DynamicDataSource extends AbstractRoutingDataSource {
- static Logger log = Logger.getLogger("DynamicDataSource");
- @Override
- protected Object determineCurrentLookupKey() {
- // TODO Auto-generated method stub
- return DbContextHolder.getDbType();
- }
- }
上下文DbContextHolder为一线程安全的ThreadLocal,如下
- package com.xxx.xxx.util;
- publicclass DbContextHolder {
- privatestaticfinal ThreadLocal contextHolder = new ThreadLocal();
- publicstaticvoid setDbType(String dbType) {
- contextHolder.set(dbType);
- }
- publicstatic String getDbType() {
- return (String) contextHolder.get();
- }
- publicstaticvoid clearDbType() {
- contextHolder.remove();
- }
- }
sql-map-config.xml如下
- <?xmlversion="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>
- <sqlMapresource="com/xxx/xxx/dao/sqlmap/Object.xml"/>
- </sqlMapConfig>
这样在调用service之前只需要设置一下上下文即可调用相应的数据源,如下:
- DbContextHolder.setDbType("2");
- //execute services
- //.........
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;
- publicclass 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);
- }
- }
0 0
- Spring+iBatis多数据源的动态配置方案
- Spring+iBatis多数据源的动态配置方案
- Spring+iBatis多数据源的动态配置方案
- Spring+iBatis多数据源的动态配置方案
- 基于spring和ibatis的多数据源切换方案
- Spring、Ibatis 配置多数据源
- spring+ibatis配置多数据源
- Spring+ibatis 多数据源的配置和使用
- SPRING IBATIS 多数据源
- spring的多数据源配置(spring+ibatis + oracle环境下)
- Spring的多数据源配置(Spring+iBATIS + Oracle环境下)
- spring的多数据源配置(spring+ibatis + oracle环境下)
- Spring 的动态多数据源的配置
- 基于 Spring 和 iBATIS 的动态可更新多数据源持久层
- Spring动态配置多数据源
- spring动态配置多数据源
- Spring动态配置多数据源
- 使用Spring解决ibatis多数据源的苦恼
- 黑马程序员------Java内部类
- Daemon函数的用法
- 李平:大型网站的灵魂——性能
- Js:Js对象——其他对象
- Spring + hibernate + struts2 +jotm JTA事务
- Spring+iBatis多数据源的动态配置方案
- 存储型XSS与反射型XSS有什么区别?
- js里面alert弹出框中文乱码问题
- thingking in Java 枚举类型
- Nginx的配置与部署(7)核心模块之主模块的非测试常用指令
- 数据结构学习----链式队列(Java实现)
- Tomcat单机多实例
- Flume-ng将数据插入hdfs与HBase-0.96.0
- 为什么要动态连接