在项目中,有时遇到连接多个数据库的情况,并且根据用户的操作不同,连接不同的数据库,这时,就要动态切换数据库。环境:SSH(利用到了Hibernate 注解)。
Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样*就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),**由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现
determineCurrentLookupKey()在其中封装数据源的选择逻辑。 步骤如下:
一:动态配置多数据源(用类表示)
public class DataSourceConst {
public static final String Admin="admin";//admin和配置文件中的
对应
public static final String User="user";//user和配置文件中的
对应
}
二:建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称
public class DataSourceContextHolder {
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();
}
}
三:建立动态数据源类,返回一个Object,一般是返回字符串
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
四:编写spring的配置文件配置多个数据源 applicationContext.xml 部分代码
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
classpath:db.properties
classpath:newdb.properties
org.hibernate.dialect.MySQLDialect
true
com.luguang.model
五:在应用程序中,动态切换数据库
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
DataSourceContextHolder.setDataSourceType(DataSourceConst.Admin);
LgispUser user0=new LgispUser();
user0.setUserAlias("AdminDB 000user");
user0.setOrgId(1);
this.lgispUserService.getEntityDao().save(user0);
DataSourceContextHolder.setDataSourceType(DataSourceConst.User);
this.lgispUserService.getEntityDao().save(user0);