Spring配置多数据源

来源:互联网 发布:淘宝网商城女装 编辑:程序博客网 时间:2024/05/16 01:22
1. 首先在配置文件中配置多个dataSource
2. 扩展Spring的AbstractRoutingDataSource抽象类,实现动态数据源。
AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是实现数据源的route的核心.这里对该方法进行Override。
Java代码  收藏代码
  1. public class DynamicDataSource extends AbstractRoutingDataSource{     
  2.      
  3.     @Override     
  4.     protected Object determineCurrentLookupKey() {     
  5.         return DBContextHolder.getDBType();     
  6.     }     
  7. }    
 
上下文DbContextHolder为一线程安全的ThreadLocal,具体代码如下:
Java代码  收藏代码
  1. public class DBContextHolder{     
  2.     public static final String DATA_SOURCE_FROM = "dataSourceFrom";     
  3.     public static final String DATA_SOURCE_TO = "dataSourceTo";     
  4.          
  5.     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();     
  6.          
  7.     public static void setDBType(String dbType) {     
  8.         contextHolder.set(dbType);     
  9.     }     
  10.          
  11.     public static String getDBType() {     
  12.         return contextHolder.get();     
  13.     }     
  14.          
  15.     public static void clearDBType() {     
  16.         contextHolder.remove();     
  17.     }     
  18. }    
 
3. 配置动态数据源
将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。
Java代码  收藏代码
  1. <bean id="dynamicDataSource" class="datasource.DynamicDataSource" >     
  2.     <!-- 通过key-value的形式来关联数据源 -->     
  3.     <property name="targetDataSources">     
  4.         <map>     
  5.             <entry value-ref="dataSourceFrom" key="dataSourceFrom"></entry>     
  6.             <entry value-ref="dataSourceTo" key="dataSourceTo"></entry>     
  7.         </map>     
  8.     </property>     
  9.     <property name="defaultTargetDataSource" ref="dataSourceFrom" />     
  10. </bean>     

 

 

 

4. 使用动态数据源
DynamicDataSource是继承与AbstractRoutingDataSource,而AbstractRoutingDataSource又是继承于org.springframework.jdbc.datasource.AbstractDataSource,AbstractDataSource实现了统一的DataSource接口,所以DynamicDataSource同样可以当一个DataSource使用。
Java代码  收藏代码
  1. <!-- JdbcTemplate使用动态数据源的配置 -->     
  2. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">     
  3.     <property name="dataSource">     
  4.         <ref bean="dynamicDataSource" />     
  5.     </property>     
  6. </bean>     
  7.      
  8. <!-- 对JdbcTemplate的应用封装类 -->     
  9. <bean id="sqlBaseDAO" class="com.whty.dao.BaseDAOImpl">     
  10.     <property name="jdbcTemplate">     
  11.         <ref bean="jdbcTemplate" />     
  12.     </property>     
  13. </bean>  
 5. 动态数据源的管理
如何选择控制每个业务中需要的具体数据源,可是使用手动控制:
Java代码  收藏代码
  1. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");     
  2. BaseDAO dao = (BaseDAO) context.getBean("sqlBaseDAO", BaseDAOImpl.class);     
  3.      
  4. try {     
  5.     DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_FROM);     
  6.     System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM"));     
  7.     DBContextHolder.setCustomerType(DBContextHolder.DATA_SOURCE_TO);     
  8.     System.err.println(dao.select("select count(*) sum from TEST t ").get(0).get("SUM"));     
  9.          
  10. catch (Exception e) {     
  11.     e.printStackTrace();     
  12. }    
 如果在service层有比较统一的规则的话,也可以使用aop设置数据源使用。
6. 这里一般都是一个service一个数据源,所以最好使用aop在service层执行完之后统一调用
Java代码  收藏代码
  1. DBContextHolder.clearDBType();  
 清空数据源信息。
当然,在上面配置里面有个参数defaultTargetDataSource为默认数据源,就是不设置数据源的话,就是用这个数据源。
0 0