spring+hibernate动态切换数据源

动态切换数据源确切的来说是在同一类型数据库的情况下的。意思就是说 , 在系统中的使用的数据库分布在多台数据库服务器或者在同台服务器上的多个数据库. 在运行时期间根据某种标识符来动态的选择当前操作的数据库.

  1. 数据源是相同类型的数据库: 一个SessionFactory+动态数据源+一个事务管理器
  2. 数据源是不同类型的数据库: 根据类型 配置多套SessionFactory

spring配置




    
         
         
        
        
             PROPAGATION_REQUIRES_NEW            
             PROPAGATION_REQUIRED
             PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
			 PROPAGATION_REQUIRED,readOnly
        
     
   

	
	
		
        
        
        
		
		
		
		
		
		
		
		
		
		
		
		
		
		
  	
  	
  	
	
		
        
        
        
		
		
		
		
		
		
		
		
		
		
		
		
		
		
  	
  	
	
	
	    
		
			
				
				
			
		
        
		
		
	
  	
  	
       
           
       
       
       		
	       		classpath*:modelConfig/db1/${dataSource}/*.hbm.xml
	       		classpath*:modelConfig/db2/${dbTwo.dataSource}/*.hbm.xml
       				
	   
     
	    
	       ${hibernate.dialect}
	       true
	    
	
  
  
  
       
           
       
  
  

properties配置

driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.2.112:1521:ORCL
username=imssc5
password=sa
initialSize=5
maxActive=50
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
dataSource=oracle
jndiName=image

dbTwo.driverClassName=com.mysql.cj.jdbc.Driver
dbTwo.url=jdbc\:mysql\://localhost\:3306/zgh?serverTimezone=GMT&autoReconnect=true&characterEncoding=utf-8&useSSL=false
dbTwo.username=root
dbTwo.password=gao24
dbTwo.initialSize=5
dbTwo.maxActive=50
dbTwo.dataSource=mysql
dbTwo.hibernate.dialect=org.hibernate.dialect.MySQLDialect
DynamicDataSource类
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        // 获取数据源标识
        return DynamicDataSourceHolder.getDataSource();
    }

}
DynamicDataSourceHolder类
public class DynamicDataSourceHolder {
    // 线程本地环境  
    private static final ThreadLocal contextHolder = new ThreadLocal();  
      
    // 设置数据源类型  
    public static void setDataSourceType(String dataSourceType) {  
        contextHolder.set(dataSourceType);  
    }  
  
    // 获取数据源类型  
    public static String getDataSourceType() {  
        return (String) contextHolder.get();  
    }  
  
    // 清除数据源类型  
    public static void clearDataSourceType() {  
        contextHolder.remove();  
    }  

}

切换可以直接根据注册进动态数据源的key值进行选择。
需要注意的是,切换数据源要在事务之前就可以了。否则不生效。

@Controller
public class Test {
    @Autowired
    private DynDataSourceService dataSourceService;
    @RequestMapping("/Test")
    public String test() {
        DynamicDataSourceHolder.setDataSource("dataSourceTwo");
        return dataSourceService.find();
    }
}

参考:

https://blog.csdn.net/qq_35830949/article/details/80885745

https://www.cnblogs.com/kongpeng/p/6483568.html

你可能感兴趣的:(spring+hibernate动态切换数据源)