spring+mybaties 配置多数据源



在实际的开发中遇到了需要2个数据源的情况。这里我们就需要配置多数据源了。
1  首先配置多数据源有2种实现方式   
1)简单方式:一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的sessionFactory和dao层代码我们称之为静态数据源配置
2)动态方式: 配置多个数据源,只对应一套sessionFactory,数据源之间可以动态切换。
2   這两种方式相比较来看,第一种如果以后要配置多个数据源的话,对应都要配置sessionfactory. 第2种只需配置多个数据源自由切换对应一个sessionfactory 明显比第一个更装B一点。下面就是详细介绍我自己配置的第2中方法。首先是先配置2个数据源




 
  
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
	http://www.springframework.org/schema/tx  
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">

	公共的默认数据源配置
		
	
			
		
		
		
		
		
		 
		
		
		
		  
		
		
		
		
		
		
		
		  
		
		
		
		 
		
        
        
        
        
        
        
        
        
        
        
	
	
	
		
	
			
		
		
		
		
		
		 
		
		
		
		  
		
		
		
		
		
		
		
		  
		
		
		
		 
		
        
        
        
        
        
        
        
        
        
        
	
	


4  然后是配置转换器

	
	 
		
			
			
		
	 
	 
   

5配置切面



   
	
		
		
		
		
	
  
	
6.配置sessionfactory


		
		
		
  		
  	

7   AbstractRoutingDataSource转换器代码 

DynamicDataSource

package com.shangde.common.datesource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
	@Override
	protected Object determineCurrentLookupKey() {
		return CustomerContextHolder.getCustomerType();
	}
}

DataSourceInterceptor

package com.shangde.common.datesource;

import org.aspectj.lang.JoinPoint;
public class DataSourceInterceptor {

	public void setdataSourceMaster(JoinPoint jp) {
		CustomerContextHolder.setCustomerType("dataSource_master");
	}
	
	public void setdataSourceWebsite(JoinPoint jp) {
		CustomerContextHolder.setCustomerType("dataSource_website");
	}
}

CustomerContextHolder
package com.shangde.common.datesource;

public class CustomerContextHolder {
	public static final String DATA_SOURCE_MASTER = "dataSource_master";
	public static final String DATA_SOURCE_WEBSITE = "dataSource_website";
	private static final ThreadLocal contextHolder = new ThreadLocal();
	public static void setCustomerType(String customerType) {
		contextHolder.set(customerType);
	}
	public static String getCustomerType() {
		return contextHolder.get();
	}
	public static void clearCustomerType() {
		contextHolder.remove();
	}
}


8 好了代码就这么多了  一些失误的配置自行解决。

原理: AbstractRoutingDataSource 能够通过key的值在 map中寻找对应的 值,也就是对应的数据源。然而怎么才能获得key的值呢?。我们对不同数据源分包(package)管理,同一包下的代码使用了同一数据源。通过AOP来实现,大家都知道web开发常见是三层结构:controller、service、dao。假设我们创建了2个包  package1 ,package2分别对应不同的数据源db1 和db2。在对应的包下面创建 我们 service 包 和 dao 包 ,我们只需要用AOP切 不同数据源下的包名的service的目录即可,当controller层调用service 类时,发现它在 package1 .service 包下,这是spring 切面就会调用 切面类,设置代表数据源的字符串db1然后AbstractRoutingDataSource根据db1這个key在map中找到对应的数据源 db1 .然后我们只是找到了這个数据源,那么怎么用呢。

我们发现AbstractRoutingDataSource   extends   AbstractDataSource 发现他继承自 AbstractDataSource。而且刚才我们已经找到了我们到底要那个数据源,这样我们就可以直接使用 這个实现了 AbstractRoutingDataSource   的类作为数据源了。






你可能感兴趣的:(spring,java,spring,数据)