最近,公司的项目需要升级,要求把数据库做成可以配置的,即客户可以设置要链接哪个服务器上的哪个数据库。
例如:用户可以选择“测试数据库”,那么用户的所有操作都是在测试数据库上进行的;如果用户选择”正式数据库“,那么相应的操作都是在正式数据库上进行。
并且用户在使用过程中,可以随时切换数据库。
公司使用的系统框架是:SSH。大家有没有什么解决思路?谢谢!
最近,公司的项目需要升级,要求把数据库做成可以配置的,即客户可以设置要链接哪个服务器上的哪个数据库。
例如:用户可以选择“测试数据库”,那么用户的所有操作都是在测试数据库上进行的;如果用户选择”正式数据库“,那么相应的操作都是在正式数据库上进行。
并且用户在使用过程中,可以随时切换数据库。
公司使用的系统框架是:SSH。大家有没有什么解决思路?谢谢!
我查看了一下SessionFactory的源代码 二级缓存就是基于SessionFactory的 如果整个应用程序只有是单例的SessionFactory的话 二级缓存是依然存在的 所以切换数据源后 同样要情况缓存 清空的方法是sessionFactory.evictQueries() ;
至于 第二个问题 sessionFactory 可以自己定义一个数据源 dataSourceAwre 实现ApplicationContextAware 代码如下
public class DataSourceAwre implements ApplicationContextAware
{
private ApplicationContext applicationContext ;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
// TODO Auto-generated method stub
this.applicationContext = applicationContext;
}
public DataSource getDataSource(String dataSourceName){
return (DataSource)applicationContext.getBean(dataSourceName);
}
在配置文件中:
然后
DataSourceAwre dataSourceAwre = (DataSourceAwre )ctx.getBean("dataSourceAwre");
Session session = sessionFactory.openSession(dataSourceAwre .getDataSource(datasourceName).getConnection());
dataSourceName 可以使用ThreadLocal保存 在同一个线程内有效, 也可以通过其他例如session request 等等对象保存。
=============== 以上内容纯属个人想法,因为时间关系 所以只给出了思路,具体实现 个人再去完成和验证===========