Spring iBatis 多数据源配置

随着业务增长,一般会对数据进行垂直切分与水平切分, 一般会有一个应用对应多个数据源的需求。

本文基于Spring 3.1.1.RELEASE 和 iBatis 实现多数据源配置, 有以下两种方法。

配置多个SqlMapClientTemplate

一个SqlMapClientTemplate 对应一个数据源

  
  
    
    
    
    
  
  
    
      
        
          classpath:ibatis/sqlmap-config.xml
        
        
          
        
      
    
    
      
    
  
  

  
  
    
    
    
    
  

  
    
      
        
          classpath:ibatis/sqlmap-config.xml
        
        
          
        
      
    
    
      
    
  

设置好 sqlMapClientTemplate 后,在不同的DAO 中引用对应的sqlMapClientTemplate

  
    
  

  
    
  

重写AbstractRoutingDataSource 的determineCurrentLookupKey 方法

  • 使用ThreadLocal 来保存当前线程使用的数据源
public class DynamicDataSourceHolder {
    /**
     * 数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
     */
    private static final ThreadLocal THREAD_DATA_SOURCE = new ThreadLocal();

    public static String getDataSource() {
        return THREAD_DATA_SOURCE.get();
    }

    public static void setDataSource(String dataSource) {
        THREAD_DATA_SOURCE.set(dataSource);
    }

    public static void clearDataSource() {
        THREAD_DATA_SOURCE.remove();
    }
}
  • 编写DynamicDataSource.java 类重写AbstractRoutingDataSource 的determineCurrentLookupKey 方法
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // 从自定义的位置获取数据源标识
        return DynamicDataSourceHolder.getDataSource();
    }
}
  • 配置数据源
  
  
    
    
    
    
  
  

  
  
  
    
    
    
    
  
  

  
  
    
    
    
  
  
    
  
  
    
    
    
    
  
  

  
  
    
    
  
  
    
    
      
    
  
  
  • 在各个DAO引用sqlMapClientTemplate
  
    
  
  • 在使用DAO 来进行查询之前设置成应该使用的数据源
    public InstanceDO getByInstanceId(NewBaseRequest request) {
        DynamicDataSourceHolder.setDataSource("rds");

        InstanceDO instance = instanceDAO.getByInstanceId(request.getDbInstanceId());
        
        return instance;
    }

你可能感兴趣的:(Spring iBatis 多数据源配置)