Hibernate 缓存项未被使用

Hibernate 缓存项未被使用,hibernate,jsf,jboss,ejb,Hibernate,Jsf,Jboss,Ejb,我们有一个使用以下技术的web应用程序:JSF2.0、EJB3.1、JPA2.0、JBossAS 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 abstra

我们有一个使用以下技术的web应用程序:JSF2.0、EJB3.1、JPA2.0、JBossAS 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] ...

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

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

我遇到的问题是,对我来说这两个都不是。我在测试设置中只有一个有状态bean,它分别注入到各种无状态bean中-我可以在启动测试运行的几秒钟内生成异常。如果你找到了替代方法,我仍在努力跟踪哪里出了问题你问题的解决办法你能把它寄出去吗

詹姆斯,Rgds

我已经把它缩小到并发访问——我可以发出很多连续的请求,但在此之前只有几个“并发”请求(我在引号中加上concurrent,因为我正在同步@SessionScoped ejb持有的锁,所以唯一可能的并发调用是我在它上创建的getLock()方法)


我完全搞不清楚Weld是允许还是阻止并发访问@SessionScoped@Stateful EJB。我读到Seam序列化了访问(Weld是从Seam中诞生的)但我不知道是否真的是这样。如果是这样,那么其他因素会导致我的bean死亡。但是,通过从单独的@Stateless bean进行并发访问,它很容易复制。

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

最后,我试图通过JBoss AS7源代码找到问题所在(目前正在讨论中)。这似乎是一个错误-JBoss仅在您的呼叫位于活动事务(BMT或CMT)内时才同步访问。如果不在活动事务内,则同步失败-而且不可能(据我所知)同步或锁定您自己,因为您只能访问bean的代理,而不能访问底层实例本身。在代理上同步对于代理所在的线程以外的任何事情都是无用的

目前的解决办法是确保所有可能并发的调用都包装在一个事务中。我惊喜地发现,在扩展PersistenceContext上如此频繁地打开和关闭事务的性能开销非常小,但我并没有真正努力:)


我怀疑这个问题会影响所有AS7版本,但我们只在AS7.1上确认了它。

是的,你是对的。我们得出了相同的结论,并重构了一些方法,因此会话bean不会被多次调用。此外,我们现在在用户按下按钮后停用按钮,以防止并发调用。在我们的例子中,我们有一个很多方法都用@TransactionaAttribute注释(TransactionAttributeType.NOT_SUPPORTED)。因此,如果我理解正确,将类型更改为REQUIRES_NEW应该可以防止异常(仅供参考,我们将大多数SFSB注入JSF托管bean)是的,绝对是。我会选择REQUIRED而不是REQUIRED\u NEW,如果有,那么该方法将参与现有事务,如果没有,则创建自己的事务。我花了好几天的时间来解决这个问题——我不太喜欢重构我的代码域来弯曲工具,我更喜欢弯曲工具。也就是说,我是一个完全的业余爱好者,所以我可以很可能我会选择更好的战斗!