【问题标题】:How to resolve hibernate caching exception如何解决休眠缓存异常
【发布时间】:2018-01-09 16:27:02
【问题描述】:

我有时只能看到缓存异常,我也无法重现。 所以只是想知道我该怎么做。

我们使用的是 Jboss As 5.1 和 Hibernate 3.3.2.GA 版本

我们有一个实体

 @Table(name = "TBL_COUNTRY")
 @Entity
 @Cache(region="/country", usage=CacheConcurrencyStrategy.READ_ONLY)
 public class Country implements Serializable {
}

休眠配置:

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
    <property name="hibernate.show_sql" value="false" />
    <property name="hibernate.format_sql" value="false" />

    <!-- Clustered cache with TreeCache -->
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    <property name="hibernate.cache.use_second_level_cache" value="true" />
    name="hibernate.cache.use_query_cache" value="true" />
    name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory" />

    <property name="hibernate.cache.region.jbc2.query.localonly" value="true"/>
    <property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager" />
    <property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity" />
    <property name="hibernate.cache.region.jbc2.cfg.query"  value="local-query" />
    <property name="hibernate.cache.region_prefix" value="ecommerce"/>

    <property name="jboss.depends.1" value="jboss:service=Naming"/>
    <property name="jboss.depends.2" value="jboss:service=TransactionManager"/>
    <property name="jboss.depends.3" value="jboss.cache:service=CacheManager"/>
    <property name="jboss.depends.4" value="jboss.jca:name=ecomm-ds,service=ManagedConnectionPool"/>
</properties>

附上日志

2017-07-26 18:31:45,849 警告 [com.arjuna.ats.arjuna.logging.arjLoggerI18N] (http-XXXXXXXXXX%2F10.137.96.103-8080-17) [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - 失败 com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@1e9b02ed org.jboss.cache.optimistic.DataVersioningException:事务 试图创建 /ecommerce/currency/QUERY/sql: 选择 currency2_.ID 作为 ID7_,currency2_.CONVERSION_FACTOR 作为 CONVERSION2_7_, currency2_.ISO_NAME 作为 ISO3_7_,currency2_.NAME 作为 NAME7_, currency2_.SYMBOL 作为 SYMBOL7_ 来自 TBL_COUNTRY country0_ 左外 加入 TBL_SHIPPING_ZONE_COUNTRY country0_1_ on country0_.ID=country0_1_.COUNTRY_ID 内联 TBL_SHIPPING_ZONES shippingzo1_ on country0_1_.SHIPPING_ZONE_ID=shippingzo1_.ID 内部 加入 TBL_CURRENCIES 货币 2_ 上 shippingzo1_.CURRENCY_ID=currency2_.ID where country0_.ID=?; 参数: ;命名参数:{countryCode=US} 重新命名。它已经 自此事务开始以来由另一个(可能 远程)交易。我们有一个并发的创建事件。 在 org.jboss.cache.interceptors.OptimisticValidatorInterceptor.visitOptimisticPrepareCommand(OptimisticValidatorInterceptor.java:116) 在 org.jboss.cache.commands.tx.OptimisticPrepareCommand.acceptVisitor(OptimisticPrepareCommand.java:55) 在 org.jboss.cache.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:116) 在 org.jboss.cache.interceptors.OptimisticLockingInterceptor.visitOptimisticPrepareCommand(OptimisticLockingInterceptor.java:89) 在 org.jboss.cache.commands.tx.OptimisticPrepareCommand.acceptVisitor(OptimisticPrepareCommand.java:55) 在 org.jboss.cache.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:116) 在 org.jboss.cache.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:131) 在 org.jboss.cache.commands.AbstractVisitor.visitOptimisticPrepareCommand(AbstractVisitor.java:155) 在 org.jboss.cache.commands.tx.OptimisticPrepareCommand.acceptVisitor(OptimisticPrepareCommand.java:55) 在 org.jboss.cache.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:116) 在 org.jboss.cache.interceptors.TxInterceptor.runPreparePhase(TxInterceptor.java:682) 在 org.jboss.cache.interceptors.TxInterceptor$LocalSynchronizationHandler.beforeCompletion(TxInterceptor.java:1102) 在 org.jboss.cache.interceptors.OrderedSynchronizationHandler.beforeCompletion(OrderedSynchronizationHandler.java:81) 在 com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101) 在 com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269) 在 com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89) 在 com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177) 在 com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423) 在 com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137) 在 com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75) 在 org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170) 在 org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87) 在 org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.security.RunAsSecurityInterceptorv2.invoke(RunAsSecurityInterceptorv2.java:94) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41) 在 org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.interceptor.EJB3TCCLInterceptor.invoke(EJB3TCCLInterceptor.java:86) 在 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 在 org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:323) 在 org.jboss.ejb3.stateless.StatelessContainer.invokeEndpoint(StatelessContainer.java:691) 在 org.jboss.wsf.container.jboss50.invocation.InvocationHandlerEJB3.invoke(InvocationHandlerEJB3.java:96) 在 org.jboss.ws.core.server.ServiceEndpointInvoker.invoke(ServiceEndpointInvoker.java:222) 在 org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:474) //省略

【问题讨论】:

  • 通过 git 分享这个问题部分的简单项目(检查配置\映射\TM...)。此问题可能有不同的原因。
  • 你写region吗?它只是准备好了?
  • 是的,我们只需要写很少的次数。大多数情况下它是只读的
  • 你不能更新它,因为它是只读的。你必须改变策略。

标签: java hibernate jboss jboss5.x hibernate-cache


【解决方案1】:

如果您的应用程序需要读取而不是修改持久类的实例,则可以使用只读缓存。这是最简单和最佳的执行策略。在集群中使用它甚至是安全的。 More details.

【讨论】:

  • Strategy: nonstrict read/write 偶尔更新数据。原因可以在异常跟踪Caused by: javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Could not commit transaction.中找到
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多