您现在的位置是:首页 >

数据源是针对一个数据库 使用Spring解决ibatis多数据源的苦恼

火烧 2023-02-18 12:05:18 1054
使用S ri g解决i ati 多数据源的苦恼   iBati 多数据源的苦恼  在仅使用i ati 时 多数据源简直就是梦魇 每多一个数据源就需要多一份 ql ma co fig配置文件   采用

使用Spring解决ibatis多数据源的苦恼  

  iBatis多数据源的苦恼

  在仅使用ibatis时 多数据源简直就是梦魇 每多一个数据源就需要多一份sql map config配置文件

  采用spring的AbstractRoutingDataSource就可以简单的解决这个问题

  AbstractRoutingDataSource实现了javax sql DataSource接口 因此可以理解为一个虚拟的动态DataSource 在需要的时候根据上下文Context动态决定使用哪个数据源

数据源是针对一个数据库 使用Spring解决ibatis多数据源的苦恼

  Spring+iBatis多数据源的配置

  下面是一个完整的配置

  

  < beans xmlns=   xmlns:xsi= instance   xmlns:aop=   xmlns:tx=   xmlns:jee=   xsi:schemaLocation=    beans xsd   aop xsd   tx xsd   jee xsd >

  < ! ========================= GENERAL DEFINITIONS ========================= > < jee:jndi lookup id= ds jndi name= jdbc/ds /> < jee:jndi lookup id= ds jndi name= jdbc/ds /> < jee:jndi lookup id= ds jndi name= jdbc/ds />

  < bean id= dataSource class= xxx xxx util DynamicDataSource >         < property name= targetDataSources >            < map key type= java lang String >               < entry key= value ref= ds />               < entry key= value ref= ds />               < entry key= value ref= ds />            < /map>         < /property>         < property name= defaultTargetDataSource ref= /> < /bean>        < ! SqlMap setup for iBATIS Database Layer > < bean id= sqlMapClient class= springframework orm ibatis SqlMapClientFactoryBean >  < property name= dataSource ref= dataSource />  < property name= configLocation value= classpath:/xxx/xxx/dao/sqlmap/sql map config xml /> < /bean>        < bean id= testDAO class= xxx xxx dao impl TestDAO >  < property name= sqlMapClient ref= sqlMapClient /> < /bean>        < bean id= testService class= xxx xxx service impl TestService >  < property name= testDAO ref= testDAO /> < /bean>< /beans>

  其核心是DynamicDataSource 代码如下

  

  package xxx xxx util;

  import apache log j Logger;import springframework jdbc datasource lookup AbstractRoutingDataSource;

  public class DynamicDataSource extends AbstractRoutingDataSource {

  static Logger log = Logger getLogger( DynamicDataSource ); @Override protected Object determineCurrentLookupKey() {  // TODO Auto generated method stub  return DbContextHolder getDbType(); }

  }

  上下文DbContextHolder为一线程安全的ThreadLocal 如下

  

  package 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= encoding= UTF standalone= no ?>< !DOCTYPE sqlMapConfig PUBLIC ////DTD SQL Map Config //EN         map config dtd >

  < sqlMapConfig>

  < sqlMap resource= /xxx/xxx/dao/sqlmap/Object xml />

  < /sqlMapConfig>

  这样在调用service之前只需要设置一下上下文即可调用相应的数据源 如下

   DbContextHolder setDbType( );//execute services//

  dao如下

  

  package xxx xxx dao impl;

  import java util HashMap;import java util List;import java util Map;

  import apache log j Logger;import springframework orm ibatis support SqlMapClientDaoSupport;

  import 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);    }}

lishixinzhi/Article/program/Java/ky/201311/28536  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码