多库数据源深入分析(Mybatis+ Spring + JTA)(一)

阅读更多

 

最近搭建架构,碰到JTA和事务Transaction的问题,在此做个总结:

 

架构:Mybatis+ Spring

 

技术:spring的AbstractRoutingDataSource和JTA

 

老规矩,先贴代码,在讲原理,刚开始的时候不使用JTA,代码如下:

 

 

/**
* DataSource上下文句柄,通过此类设置需要访问的对应数据源
*
*/
public class DataSourceContextHolder {

    /**
     * DataSource上下文,每个线程对应相应的数据源key
     */
    public static final ThreadLocal contextHolder = new ThreadLocal();
    
    public static void setDataSourceType(String dataSourceType)
    {
        contextHolder.set(dataSourceType);
    }
    
    public static String getDataSourceType()
    {
        return contextHolder.get();
    }
    
    public static void clearDataSourceType()
    {
        contextHolder.remove();
    }
}

 

 

 

/**
* 动态数据源
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }

}

 

 

spring中配置如下:

 

 


		
				
				
				
				
				
				
				
				
		

		
				
				
				
				
				
				
				
				
		

		
		
				
						
																
								
						
				
				

		

		
		
				
		
		

		
		
				
				
		

		
		
				
		
 

因为每个Service目前只可能访问一个DataSource,所以在调用Service的时候,调用DataSourceContextHolder.setDataSourceType(key)(key可以为ds1,ds2),

就可以动态切换数据源了当然最好用AOP思想,技术上spring + AspectJ,在每个Service需要的方法切上一刀),

而且对于spring的@Transactional事务管理是起作用的

 

 

OK,按照这种模式,如果Service可能访问多个库,就将DataSourceTransactionManager换成JtaTransactionManager

 

 


	
 

当然,Datasource换成JNDI获取

 

 


	
		
			ds1
		
		
			true
		
	
	
		
			ds2
		
		
			true
		
	 
 

spring的@Transactional事务管理中,那是死活无法切换数据源

 

由于内容有点多,这个技术总结分为两部分。

 

 

 

你可能感兴趣的:(多库,多数据源,JTA)