ice_i_snow 2010-06-18 21:23
浏览 282
已采纳

Hibernate如何动态链接数据库?

最近,公司的项目需要升级,要求把数据库做成可以配置的,即客户可以设置要链接哪个服务器上的哪个数据库。

 

 

例如:用户可以选择“测试数据库”,那么用户的所有操作都是在测试数据库上进行的;如果用户选择”正式数据库“,那么相应的操作都是在正式数据库上进行。

 

并且用户在使用过程中,可以随时切换数据库。

 

公司使用的系统框架是:SSH。大家有没有什么解决思路?谢谢!

  • 写回答

7条回答 默认 最新

  • iteye_10212 2010-06-22 11:59
    关注

    我查看了一下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 等等对象保存。

    =============== 以上内容纯属个人想法,因为时间关系 所以只给出了思路,具体实现 个人再去完成和验证===========

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多