【问题标题】:Cache entry not in use缓存条目未使用
【发布时间】:2012-03-14 15:13:12
【问题描述】:

我们有一个使用以下技术的 Web 应用程序:JSF 2.0、EJB 3.1、JPA 2.0、JBoss AS 7.1 Final

有时我们会莫名其妙地得到以下异常:

09:46:29,664 ERROR [org.jboss.ejb3.invocation] (http-10.99.0.10-10.99.0.10-8080-14) JBAS014134: EJB Invocation failed on component VehicleServiceBean for method public abstract java.util.List com.hji.common.service.VehicleService.findVehiclesBySearchCriteriaAndImporterIds(com.hji.common.domain.repository.VehicleRepository$VehicleSearchCriteria,java.lang.String,java.util.List,boolean): java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111,
-104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use
          at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor.releaseInstance(StatefulSessionSynchronizationInterceptor.java:197) ...
**Caused by: java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111, -104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use**
          at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
          at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] ...

我已经在网上搜索了一段时间,但找不到任何解决方案。有人知道这种错误吗?

【问题讨论】:

    标签: hibernate jsf jboss ejb


    【解决方案1】:

    我一直在环顾四周,因为我遇到了类似的问题。我只找到了两种可能的解释:要么您的有状态 bean 超时(在 AS7.1 上默认为 5000 秒),要么您正在将 SFSB 的引用从一个线程传递到另一个线程 - 哪个(建议在the jboss forum 是不允许的。如果是前者,要么增加超时时间,要么捕获异常。如果是后者,让 jboss 在需要的地方注入有状态 bean,而不是到处传递。

    我遇到的问题是这两个都不适合我。我在测试设置中只有一个有状态 bean,它分别注入到各种无状态 bean 中——我可以在开始测试运行的几秒钟内生成异常。我仍在努力追查哪里出了问题 - 如果您找到了解决问题的替代方法,您可以发布吗?

    Rgds,詹姆斯

    我已将范围缩小到并发访问 - 我可以发出大量顺序请求,但在此之前只有少数“并发”请求。 (我将并发放在引号中,因为我正在同步 @SessionScoped ejb 持有的锁,所以唯一可能的并发调用是我在其上创建的 getLock() 方法)。

    对于 Weld 是否允许或阻止对 @SessionScoped @Stateful EJB 的并发访问,我完全感到困惑。我读到Seam 序列化了访问(而Weld 是从Seam 诞生的),但不知道是否真的如此。如果是这样,那么其他东西导致我的豆子死了。不过,通过单独的 @Stateless bean 的并发访问,它很容易重现。

    【讨论】:

    • 是的,你是对的。我们得出了相同的结论并重构了我们的一些方法,以便会话 bean 不会被多次调用。此外,我们现在在用户按下按钮后停用按钮,以防止并发调用。
    【解决方案2】:

    好的,我现在可以提供我认为更准确的答案。我无法放弃允许并发访问有状态 ejb,因为我的应用程序使用 ajax,所以并发调用是不可避免的。我不记得在哪里找到了引用,但我知道对有状态 bean 的并发访问应该由 EJB3.1 下的容器序列化 - 所以我应该没问题。

    我最终试图通过 JBoss AS7 源来追踪我的方式,并认为我找到了问题(目前正在这里讨论 on the jboss AS7 forum)。这似乎是一个错误 - 如果您的呼叫在活动事务(BMT 或 CMT)中,jboss 只会同步访问。如果不是,则同步失败 - 并且不可能(据我所知)同步或锁定自己,因为您只能访问 bean 的代理,而不是底层实例本身。除了代理所在的线程之外,在代理上进行同步对其他任何东西都是无用的。

    目前的解决方法是确保所有可能并发的调用都包含在事务中。我惊喜地发现,在 EXTENDED PersistenceContext 上如此频繁地打开和关闭事务的性能开销非常小 - 但我并没有真正推动它:)

    我怀疑此问题会影响所有 AS7 版本,但仅在 AS7.1 上确认。

    【讨论】:

    • 在我们的例子中,我们有很多用@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)注解的方法。因此,如果我理解正确,将类型更改为 REQUIRES_NEW 应该可以防止异常? (仅供参考,我们将大部分 SFSB 注入 JSF 托管 bean)
    • 绝对是的。我会使用 REQUIRED 而不是 REQUIRES_NEW,然后该方法将参与现有事务(如果有),或者创建自己的事务。我花了几天的时间来解决这个问题——我不太喜欢重构我的代码域来弯曲工具,我更喜欢弯曲工具。那就是说我是一个完全的业余爱好者,所以可能会更好地选择我的战斗!
    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2016-05-20
    • 2018-02-13
    • 2012-08-03
    相关资源
    最近更新 更多