1

我尝试在基于 spring+tomcat 的应用程序中将 infinispan 设置为休眠的二级缓存。

<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.

如何配置事务管理器查找?

4

2 回答 2

1

spring 的简单答案是添加(在id="sessionFactory"spring XML 配置中):

<property name="jtaTransactionManager" ref="transactionManager"/>

这在 spring 3.2.2.RELEASE 中可用(它也可能在较旧的 spring 版本中可用,我猜从 spring 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 提供一个 JtaPlatform。爪哇

有关 JTA 使用的类 org.springframework.orm.hibernate4.LocalSessionFactoryBean(您正在使用)请参阅 JavaDoc。

于 2013-04-18T06:12:54.333 回答
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 环境交互的契约。

于 2012-05-24T11:52:19.353 回答