现在又个需求请大家帮忙,有一个总的数据库里面存放用户表和权限表,
另外有4个子公司的有4套完全相同的数据库。
框架是S2SH的,现在的需求是根据不同的用户去操作不同的数据库中的表,
hibernate的连接由Spring的配置文件管理。
现在的想法是4套相同的数据库用动态的方式来连接
在spring 的配置文件中配置多个sessionFactory
比如 用户表中有个子公司编号,通过子公司的编号去找对应的sessionFactory,
然后把sessionFactory传给底层的Dao。
求教各位高手咯!

解决方案 »

  1.   

    好像只能用你说的那种方法啦,对不同的数据库配置不同的sessionFactory,再判断使用...
    呵呵,和你一起等待高手好的方法
      

  2.   

    配置不同的sessionFactory 根据不同sessionFactory 再配置DAO操作的时候掉相应的DAO 就会操作不同的数据库
      

  3.   

    5楼的这个方法不能用,因为按你的想法4个子公司就需要4套Dao,万一将来子公司变成10个了呢!
      

  4.   

    配置不同的sessionFactory 根据不同sessionFactory 再配置DAO操作的时候掉相应的DAO 就会操作不同的数据库
      

  5.   

    改造你的getSessionFactory()方法吧,根据用户所属公司,获取相应的SessionFactory。
    如getSessionFactory("A")就获取到SessionFactoryA这个实例
      

  6.   

    写个工厂模式。DAO应该是一样的。只是数据库连接不一样。你可以把数据库重写下就OK了。
      

  7.   


    说的非常好。就像web接口一样。传入哪家公司的标题。调用哪家的sessionFactory。可以写个switch
      

  8.   

    比如配置多个SessionFactory的事物管理等等的配置文件怎么写!spring里面的
      

  9.   


    http://blog.csdn.net/alex197963/archive/2009/08/20/4466810.aspx
      

  10.   

    楼上给的这个例子不行,不符合我的要求!我希望做的是一个事物管理器,多个数据库连接,底层的dao根据我传的参数去动态的连接数据库!
      

  11.   


    要做事務(多數據庫之間)。。呵呵 辦不到。 SPRING用不了 ,要用得用EJB 可是你們項目是S2SH 那無解。
      

  12.   

    再開發一套 EJB3的 直接把 問題解決 。(介面曾還是S2,業務用EJB3(JPA)去做,多數據源的事務)PS:沒源碼?那重新寫吧。
      

  13.   

    我觉得可以这样:
     1,先建立用户和数据库的对照表
     2,spring配置文件中配置一个默认的datasource,主要是为了能让服务跑起来。
     3,用户登录的时候,查1建立的表,找到数据库
     4,根据3找到的数据库,修改datasource的配置,将当前用户sessionId与新datasource保存在一个hashMap中,
    5,建立一个filter,监听所有后台请求,根据sessionId4中的hashMap找到datasource,注入到sessionFactory中。
    6,还要一个sessionListener,当服务端session销毁时,从4中的hashMap中移除该sessionId对应的值。
      

  14.   

    spring 好像有提供多数据源的配置。之前好像在文档中看到过。如果没有看源码,看他怎么读取的,尝试添加一个方法。根据属性读取不到的配置
      

  15.   


    當然可以配置多個數據源,樓主的需求還要在SPRING實現多數據庫之間的  事務管理功能,這個SPRING天生缺陷,解決不了的。也許要靠第3方的東西了。這個東西我在找,記得以前有人搞過。忘記了。
      

  16.   

    http://www.360doc.com/content/09/1222/17/18042_11742680.shtml這裡。
      

  17.   

    解決辦法就是 加入第3方的 JOTM 樓主可以好好看看。
      

  18.   

    我并不是要实现多个数据库之间的事物管理,是要数据库的链接能够动态切换,配置的时候配置了多个SessionFactory,但是真正执行操作的时候只会对某一个数据库执行增删改查的操作,只是操作哪一个数据库需要由我的参数来控制!我不知道我这样讲大家能清楚我的意思不!
      

  19.   

    看8樓 穿一個 sessionFactory 裏的值
    這個值應該是 操作這個數據庫方法的權限,
    當用戶進入系統進行操作的時候判斷,這個
    用戶是否有這個權限,如果有就把這個權限的值
    傳到sessionFactory裏。用戶管理裏也可以分配或取消這個值,這個就是你要做的,並且
    在sessionFactory裏你就不用是默認的了。如果到這步,那肯定又會饒到 事務的問題上來 怎麼解決?http://topic.csdn.net/u/20110427/18/096d3f27-8e0f-4e60-bfe9-6173c7d2c710.html這裏用 到了atomikos 
      

  20.   

    既然是4套完成相同的子系统,就只是数据库连接池不一样,不知道是以配置文件出现的(.properties),还是配置在spring里面的,还是配置在hibernate.cfg.xml里面的,
    每次变都只需要修改这个文件就行了,有以下方案不知道是否可行
    1. 写4个配置文件(数据库的连接池信息)
    2 根据业务信息的实际要求判断是那套系统(总表的用户信息),然后就查找连接那个数据库
    3 其他的应该不需要动
      

  21.   


    一个方法里 要用到 DS_A ,DS_B 那如何保证在一个事务里呢 ?这个你想过没?这个没解决 其它都不要去谈了。实现了 还不如不实现 真上线了这问题要人命。
      

  22.   

    据说jta事务可以跨数据库,自己试试看
    还有就是可以几个数据库单独创建工程,使用webservice接口调用的形式绕过跨数据库
    试试看,我随便说说
      

  23.   

    http://blog.csdn.net/is_lie/archive/2011/02/17/6191596.aspx
      

  24.   

    public interface SessionFactoryMgr {
    public SessionFactory getSessionFactory();
    }
    public final class BeanFactory  implements ApplicationContextAware
    {
        private static ApplicationContext ctx ;

    @SuppressWarnings("unchecked")
        public static <T> T getBean(String id, Class<T> clazz)
        {        return (T) ctx.getBean(id, clazz);
        }
        
        public void setApplicationContext(ApplicationContext applicationcontext) throws BeansException
        {
            ctx = applicationcontext;    }
    用的时候
    sessionFactoryMgr=BeanFactory.getBean("配置文件中不同数据源id",SessionFactoryMgr.class);
    sessionFactory = sessionFactoryMgr.getSessionFactory();
    BeanFactory需要最开始时配置一下<bean class="com..BeanFactory"  />
      

  25.   

    LS正解,把spring初始化的控制权交到自己手中,问题就简单了