hibernate最新版本(3.3)是否支持如下需求:后台有多个物理数据库, master database 和 slave database1, slave database2, .....数据库服务器自身负责完成master database和slave databases的数据同步。我的问题是, 能否定义多个数据源, 通过配置或简单编码hibernate实现将所有的insert, update, delete等改变数据的操作都在master database中完成, 所有select操作分配在slave databases中完成。

解决方案 »

  1.   

    早就可以啦,定义不同的Applicationcontext.xml文件就可以实现了
      

  2.   

    方法A:
    1、首先,所有操作默认在slave database中进行
    2、使用hibernate的事件侦听:PreDeleteEventListener、PreUpdateEventListener、PreInsertEventListener,这些侦听的实现中拿到被操作的数据,调用另一个sessionFactory进行操作,然后方法返回false,就不会将数据delete、update、insert到slave database中了。
    此方法无法处理通过session.createQuery和createSQLQuery进行的操作。方法B:
    使用aop,处理session的save、update、saveOrUpdate、delete等方法
      

  3.   

    没用spring的话,写两个hibernate.cfg.xml文件分别加载,修改的内容比较多用到spring的话,应该直接改配置文件就可以搞定:
    ......
    <bean id="transactionManager1"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory1" />
    </bean>
    <bean id="transactionManager2"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory2" />
    </bean>
    <aop:config>
    <aop:pointcut id="test1"
    expression="execution(* com.xxx.service..*.*(..))" />
    <aop:pointcut id="test2"
    expression="execution(* com.xxx.service..*.*(..))" />
    <aop:advisor advice-ref="txAdvice1"
    pointcut-ref="test1" />
    <aop:advisor advice-ref="txAdvice2"
    pointcut-ref="test2" />
    </aop:config>
    <tx:advice id="txAdvice1" transaction-manager="transactionManager1">
    <tx:attributes>
    <tx:method name="select*" read-only="true" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>
    <tx:advice id="txAdvice2" transaction-manager="transactionManager2">
    <tx:attributes>
    <tx:method name="save*"  propagation="REQUIRED" isolation="REPEATABLE_READ"/>
    <tx:method name="update*"  propagation="REQUIRED" isolation="REPEATABLE_READ"/>
    <tx:method name="add*"  propagation="REQUIRED" isolation="REPEATABLE_READ" />
    <tx:method name="delete*"  propagation="REQUIRED" isolation="REPEATABLE_READ"/>
    </tx:attributes>
    </tx:advice>也可以在aop:pointcut多定义一些expression,比如
    execution(* com.xxx.service..*.delete*(..))||execution(* com.xxx.service..*.update*(..))
      

  4.   

    原系统使用Struts+Hibernate架构, 如果采用定义多datasource,引入Spring的方式,代码改动量太大。计划使用ReplicationDriver, 改动比较少。
      

  5.   

    解决方法很多,呵呵,就是操作针对不同的数据源而已,你就想不用什么hibernate,Spring等配置,直接操作数据源,用最原始的操作,也是能够实现的嘛,所以这些框架肯定能够实现的.
      

  6.   

    做了两个简单测试。
    1.  replicationdriver+直接创建jdbc连接, 可以实现写master,读slave的目标。2.  hibernate+tomcat自带的dbcp连接池+replicationdriver, 读写始终在master中进行。不知道有没有人结合hibernate,dbcp连接池,replicationdriver在实际项目中应用过,或做过测试? 请指点!  或者有其它方式能实现此目标。Notes: 不准备使用MySQL Proxy
      

  7.   

    Update Floor 11做了三个简单测试,如下:1.  replicationdriver+直接创建jdbc连接, 可以实现写master,读slave的目标。2.  tomcat自带的dbcp连接池+replicationdriver,可以实现写master,读slave的目标。3. hibernate+tomcat自带的dbcp连接池+replicationdriver, 读写始终在master中进行。不知道有没有人结合hibernate,dbcp连接池,replicationdriver在实际项目中应用过,或做过测试? 请指点!  或者有其它方式能实现此目标。Notes:
    1.  我使用的是hibernate3.0.x
    2. 不准备使用MySQL Proxy 
      

  8.   

    怀疑Hibernate不支持ReplicationConnection, 一个Session对应一个Connection, 不能对应一个ReplicationConnection。
      

  9.   

    感谢楼上各位的答复。配置多数据源的确是一种解决方式, 但是这样做对现有系统的改动量很大,是没有办法的办法。其实个人认为MySQL Proxy的方案最好, 但是MySQL Proxy本身还只是alpha版,不敢用。所以现在想到最简单的升级方案就是使用 replicationdriver, 做了简单测试,卡在和Hibernate的集成上了。谁对此有研究?
      

  10.   

    问题已搞定。hibernate3.3.2+MySQL ReplicationDriver.
      

  11.   

    在这里见过相似的内容,或许可以参考一下:Spring 与 Hibernate 配置多数据源另外spring和hibernate配置两个数据源问题 
      

  12.   

    Spring 与 Hibernate 配置多数据源

    spring和hibernate配置两个数据源问题