我正在开发一个spring应用程序,之前使用HibernateTransactionManager使用jdbc模板进行查询/更新的事务,并且工作正常。 以下是使用的代码
<bean id="sybaseDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="MySybaseDS"/>
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.sql.DataSource" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="sybaseDataSource" />
<property name="mappingResources">
<list>..........</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SybaseAnywhereDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
我正在创建一个新的应用程序,现在混淆是使用HibernateTransactionManager还是JpaTransactionManager或两者(可能?)。
应用程序将使用HibernateTemplate和JdbcTemplate(用于批量更新)进行数据库操作,并且需要是事务性的。
我的意思是,我可以/应该使用HibernateTransactionManager进行jdbctemplate和HibernateTemplate数据库操作的事务吗?使用一个事务管理器而不是另一个事务管理器会有任何性能瓶颈吗?
答案 0 :(得分:1)
简短的回答是它会起作用。有关底层详细信息的说明,另请参阅this thread。
答案 1 :(得分:1)
如果应用程序是基于JPA的(已配置实体管理器工厂),则应使用JpaTransactionManager
。
此事务管理器在事务持续期间将实体管理器绑定到线程。
HibernateTransactionManager
适用于不使用JPA但直接使用Hibernate的应用程序(已配置会话工厂)。
此事务管理器将hibernate会话绑定到线程而不是实体管理器。
它们基本相同,只有一个处理会话而另一个处理EntityManager。他们的选择完全取决于是否使用JPA。
根据各自的javadoc,两个事务管理器都与JdbcTemplate
兼容。
使用一个事务管理器与另一个事务管理器没有性能影响。
实体管理器在内部使用Hibernate会话,因此最终结果是相同的:在事务持续期间,hibernate会话直接或间接绑定到线程。