基于Spring+Mybatis的多数据源动态切换

阅读更多
Spring单数据源直接在下配置数据源的各种连接参数。但动态数据源需要配置个各个数据源例如ds1、ds2等。然后在dataSource中动态根据传递过来的参数动态调用不同的数据源。

1、当进行访问时,首先通过DbContextHolder.setDbType("ds1");设置需要使用的数据源。DbContextHolder就是一个用来存储数据源信息的类,其中通过ThreadLocal来记录数据源信息。

2、DynamicDataSource类集成Spring的AbstractRoutingDataSource类,通过determineCurrentLookupKey方法来获取数据源类型,如果没有对应的数据源则使用defaultTargetDataSource配置。

注意:当设置了数据源之后会一直使用该数据源进行连接,除非使用 DbContextHolder.setDbType重新设置数据源或使用DbContextHolder.clearDbType()清除,清除后使用defaultTargetDataSource进行连接。



1、配置文件

properties
ds1.driverClassName=oracle.jdbc.OracleDriver
ds1.url=jdbc:oracle:thin:@localhost:1521:ORCL
ds1.username=SSM
ds1.password=SSM

ds2.driverClassName=oracle.jdbc.OracleDriver
ds2.url=jdbc:oracle:thin:@10.27.192.43:1522:ORCL
ds2.username=FRAMEWORK_DEV
ds2.password=123456


xml

		
			
				
				
			
		
		
	
	
	
		
		
		
		
	
	
		
		
		
		
	


2、Java文件
com.cnpc.framework.db.DynamicDataSource 源码
public class DynamicDataSource extends AbstractRoutingDataSource {

	/**
	 * 取得当前使用那个数据源。
	 */
	@Override
	protected Object determineCurrentLookupKey() {
		return DbContextHolder.getDbType();  
	}

	
	public Logger getParentLogger() {
		// TODO Auto-generated method stub
		return null;
	}
	
}


DbContextHolder 源码
public class DbContextHolder
{
	private static final ThreadLocal contextHolder = new ThreadLocal();

	/**
	 * 设置当前数据库。
	 * @param dbType
	 */
	public static void setDbType(String dbType)
	{
		contextHolder.set(dbType);
	}

	/**
	 * 取得当前数据源。
	 * @return
	 */
	public static String getDbType()
	{
		String str = (String) contextHolder.get();
		return str;
	}
	
	/**
	 * 清除上下文数据
	 */
	public static void clearDbType()
	{
		contextHolder.remove();
	}
	
}


3、测试Code
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {

        DbContextHolder.setDbType("ds1");
        List list1 = demoSysUserService.getAll();
        System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list1.size());

        DbContextHolder.setDbType("ds2");
        List list2 = demoSysUserService.getAll();
        System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list2.size());
        DbContextHolder.clearDbType();
        
        List list = demoSysUserService.getAll();
        ModelAndView mv = this.getAutoView().addObject("sysUserList", list);
        return mv;
    }

你可能感兴趣的:(spring,java,Mybatis,DataSource)