我正在使用Websphere Application Server Express v6.1并且正在编写一个使用Spring 2.0.7,Hibernate 3.5的应用程序。我的数据源是Oracle 10g。
我有2个问题
这是我目前对Hibernate的声明
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="rmsSessionFactory" />
</bean>
Websphere的外观如何?
答案 0 :(得分:3)
即使你在幕后使用不同的实现,你也应该通过JTA管道你的交易。 (Hibernate,Webphere,Weblogic等)。理想情况下,它应该如下所示:
<bean id="transactionImpl" class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager ref="transactionImpl"/>
</bean>
如果你想使用Hibernate的事务管理器,只需将transactionImpl bean的类替换为原始问题中的hibernate类。
至于哪位经理更好,老实说,我不能想到选择其中一个的重要理由。我唯一能想到的是,如果您拥有共享负载的群集应用程序服务器,而不仅仅是故障转移,它可能会发挥作用。也许交易可以在他们之间共享?我不知道。如果有人能想到其他事情,请随时纠正我。
编辑:看起来WebSphereTransactionManagerFactoryBean(我上面使用的)不需要用于WebSphere 6.0及更高版本,并且根据WebSphere Transaction Manager Spring Docs你应该使用{{3作为JTA的直接替代品。因此,只需使用WebSphereUowTransactionManager类,而不是原始示例中的Hibernate事务管理器。 Spring从应用程序服务器的JNDI树中获取事务管理器,因此您可能必须设置一些属性来指定JNDI名称。
据我所知,WebSphere事务管理器使您能够执行事务暂停等操作。就个人而言,我会选择应用服务器的事务管理器,无论是WebSphere,Weblogic还是Glassfish等等。
答案 1 :(得分:1)
我参加了一个大型的spring + hibernate + websphere项目,而我们最终使用的是WebsphereUowTransactionManager。
问题是默认的WebsphereTransactionManager使用API的内部websphere API。 UOW TxManager工作得很好,你可以获得更多功能(我们确实使用了暂停功能)。
至于jndi问题,您不必担心设置它,事务管理器会为您处理它。
但是,我强烈建议你去UOW事务管理器看看开发人员工作article的引用,它解决了spring + hibernate + websphere的问题。
但是,Spring的早期版本(早于2.5版)使用了内部WebSphere接口 这会破坏Web和EJB容器管理资源的能力,并且不支持应用程序使用。这可能会使容器处于未知状态, 可能导致数据损坏。
你可以升级你的弹簧版本,你不太可能遇到任何问题,如果推进,你可以从春季2.5中拉出org.springframework.transaction.jta.WebSphereUowTransactionManager并将其添加到你的应用
答案 2 :(得分:0)