hibernate最新版本(3.3)是否支持如下需求:后台有多个物理数据库, master database 和 slave database1, slave database2, .....数据库服务器自身负责完成master database和slave databases的数据同步。我的问题是, 能否定义多个数据源, 通过配置或简单编码hibernate实现将所有的insert, update, delete等改变数据的操作都在master database中完成, 所有select操作分配在slave databases中完成。
解决方案 »
- 这个问题会不会是数据库连接的问题 帮下忙看看 谢谢
- 如何使用 java +php 给服务器上传 文件
- 线程安全
- 如何将tomcat+jdk打包一起使用?
- enctype="multipart/form-data" 上传问题
- 高手才请进:一个关于Spring的hibernateTemplate的问题
- spring如何动态指定数据源?
- form中有没有name属性!!!!
- 一个session监听的问题
- 在线等待中!!!急!急!急!急!急!急!急!关于测试用例出现的问题(EJB)
- 在MyEclipse里运行类似java ClassName Parameters 如何做?
- 求spring+hibernate配置多数据源
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等方法
......
<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*(..))
1. replicationdriver+直接创建jdbc连接, 可以实现写master,读slave的目标。2. hibernate+tomcat自带的dbcp连接池+replicationdriver, 读写始终在master中进行。不知道有没有人结合hibernate,dbcp连接池,replicationdriver在实际项目中应用过,或做过测试? 请指点! 或者有其它方式能实现此目标。Notes: 不准备使用MySQL Proxy
1. 我使用的是hibernate3.0.x
2. 不准备使用MySQL Proxy
和spring和hibernate配置两个数据源问题