我尝试在spring + tomcat app中将infinispan设置为hibernate的二级缓存。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${hibernate.connection.driver_class}"/>
<property name="url" value="${hibernate.connection.url}"/>
<property name="username" value="${hibernate.connection.username}"/>
<property name="password" value="${hibernate.connection.password}"/>
<property name="maxActive" value="${hibernate.connection.maxActive}"/>
<property name="maxIdle" value="${hibernate.connection.maxIdle}"/>
<property name="minIdle" value="${hibernate.connection.minIdle}"/>
<property name="maxWait" value="${hibernate.connection.maxWait}"/>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<bean class="com.arjuna.ats.jta.TransactionManager" factory-method="transactionManager"/>
</property>
<property name="userTransaction">
<bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction"/>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.example"/>
<!---->
<property name="hibernateProperties" ref="db-properties"/>
</bean>
属性是:
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.infinispan.InfinispanRegionFactory
我得到一个例外:
Caused by: org.infinispan.CacheException: This is transactional cache but no transaction manager could be found. Configure the transaction manager lookup properly.
如何配置事务管理器查找?
答案 0 :(得分:0)
Hibernate和Infinispan都需要了解TransactionManager。如果您告诉Hibernate关于TransactionManager,它将依次告诉Infinispan。我猜Spring有一种方法告诉Hibernate有关JTA的设置,但我找不到它。 Hibernate本身(我看你至少试图使用Hibernate 4)需要告诉我要使用哪个org.hibernate.service.jta.platform.spi.JtaPlatform。 org.hibernate.service.jta.platform.spi.JtaPlatform是Hibernate知道如何与JTA环境交互的合同。
答案 1 :(得分:0)
spring的简单答案是添加(id="sessionFactory"
spring XML配置内部):
<property name="jtaTransactionManager" ref="transactionManager"/>
这是在春季3.2.2.RELEASE中提供的(它也可以在较旧的弹簧版本中提供,我猜自春季3.1.x)
这应该达到Steve Ebersole指出的目标。这导致Spring通过类https://github.com/SpringSource/spring-framework/blob/master/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/ConfigurableJtaPlatform.java
提供JtaPlatform请参阅JavaDoc以获取有关JTA用法的org.springframework.orm.hibernate4.LocalSessionFactoryBean(您正在使用的)。