【问题标题】:Spring / Hibernate 4(non JPA) / Infinispan / Atomikos no transaction manager foundSpring / Hibernate 4(non JPA) / Infinispan / Atomikos 找不到事务管理器
【发布时间】:2013-11-28 00:26:33
【问题描述】:

我正在使用 Tomcat7 并且需要 JTA 用于 Infinispan 缓存。我将 Spring 3.x 与 Hibernate 4(非 JPA)和 Atomikos 用于 JTA。我在 Atomikos 库或 Hibernate 4 的文档中找不到事务管理器查找类。所有示例均适用于 Hibernate 版本 3 或使用 JPA。 Infinispan 找不到事务管理器。

这是我的配置:

 <bean id="myDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
      init-method="init" destroy-method="close">
      <property name="uniqueResourceName" value="rsname" />
      <property name="xaDataSourceClassName"
       value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
      <property name="xaProperties">
       <props>
        <prop key="URL">${db.url}</prop>
        <prop key="user">${db.user}</prop>
        <prop key="password">${db.pass}</prop>
       </props>
      </property>
      <property name="maxPoolSize" value="50" />
      <property name="minPoolSize" value="20" />

 </bean>


  <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingLocations" value="classpath*:hibernate/**/*.hbm.xml" />

    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
        hibernate.show_sql=true
        hibernate.cache.region.factory_class=org.hibernate.cache.infinispan.InfinispanRegionFactory
        hibernate.cache.use_query_cache=true
        hibernate.cache.use_second_level_cache=true

      </value>
    </property>
  </bean>

  <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
     init-method="init" destroy-method="close">
  <property name="forceShutdown" value="false" />
 </bean>



 <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction">
  <property name="transactionTimeout" value="300" />
 </bean>

 <tx:annotation-driven />
  <bean id="transactionManager"
            class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="atomikosTransactionManager,atomikosUserTransaction">
   <property name="transactionManager" ref="atomikosTransactionManager" />
   <property name="userTransaction" ref="atomikosUserTransaction" />
   <property name="allowCustomIsolationLevels" value="true" />

  </bean>
  <tx:advice id="txAdvice">
  <tx:attributes>
  <tx:method name="*" rollback-for="Throwable" />
  </tx:attributes>
</tx:advice>

【问题讨论】:

  • 不要使用事务管理器查找类,而是配置一个JtaPlatform(替换旧的管理器查找类的东西)。创建一个使用 Spring 配置的 bean 来获取事务的实现可能很容易。
  • Atomikos 没有为 Hibernate 4 实现一个?
  • 理论上将JtaTransactionManager设置为休眠(LocalSessionFactoryBean上的jtaTransactionManager属性)并且spring应该添加自己的ConfigurableJtaPlatform,这样bean就已经存在了。
  • 哪个实现? Atomikos 没有适用于 Hibernate 4 的设备

标签: spring infinispan hibernate-4.x atomikos


【解决方案1】:

查看在 LocalSessionFactoryBean 上设置 jtaTransactionManager 属性的 spring 文档应该可以解决问题。

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

基本上将其添加到 bean 的定义中就足够了。

关于您的配置的另一个注意事项,您使用的是&lt;tx:annotation-driven /&gt;,所以基本上您的&lt;tx:advice .. /&gt; 什么都不做,只会占用空间。

【讨论】:

  • 可能不相关,但我已经从 EhCache 切换到 Infinispan,现在得到 org.hibernate.cache.CacheException: Unsupported access type [read-write]
  • 将切换到“事务性”,看看会发生什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多