【问题标题】:What kind of bean should I use to provide access to a pool of objects in EJB?我应该使用哪种 bean 来提供对 EJB 中对象池的访问?
【发布时间】:2014-09-16 22:19:26
【问题描述】:

概括地说,我有一个 MemcachedPoolService 类,它有两个方法:getClientInstance() 和 returnClientInstance(client)。正如预期的那样,getClientInstance() 将 MemcachedClient (spymemcachced) 的实例返回给调用者,returnClientInstance(client) 将 MemcachedClient 返回给池。 MemcachedPoolService 需要对所有需要访问 Memcached 的其他 @Stateless 服务(注入)可用。

目前我已将 MemcachedPoolService 标记为 @Singleton,但当多个客户端尝试访问该应用时,我收到以下错误:

[0m[31m16:54:22,968 ERROR [org.jboss.as.ejb3.invocation] (http-/0.0.0.0:8080-10) 
 JBAS014134: EJB Invocation failed on component MemcachedPoolService for method public
 net.spy.memcached.MemcachedClient com.apexlab.cache.MemcachedPoolService.getClientInstance():
 javax.ejb.EJBTransactionRolledbackException: JBAS014373: EJB 3.1 PFD2 4.8.5.5.1 concurrent
 access timeout on org.jboss.invocation.InterceptorContext$Invocation@24bf375e - could not 
 obtain lock within 5000MILLISECONDS

为生产环境设置 MemcachedPoolService(以及一般的 Web 应用程序)以避免并发超时异常的最佳方法是什么?

【问题讨论】:

    标签: java jboss ejb memcached spymemcached


    【解决方案1】:

    首先,MemcachedPoolService 是一个无状态服务,因此如果您没有进行任何需要一致性的数据库更新(这就是为什么它无论如何都是@Singleton,否则您将使用@Stateless),那么只需将该类标记为

    @Singleton
    @Lock(LockType.READ)
    public class MemcachedPoolService{}
    

    @Singleton
    public class MemcachedPoolService{
    
      @Lock(LockType.READ)
      public void myPossibleMultiAccessMethod(){}
    }
    

    如果这不是一个选项,那么:

    @Singleton
    public class MemcachedPoolService{
    
      @AccessTimeout(Integer.MORE_THAN_5000_MILLIS)
      public void myPossibleMultiAccessMethod(){}
    }
    

    【讨论】:

    • 太棒了。将类上的 LockType 更改为 READ 修复了它。非常感谢!
    • 谢谢maress,如果单例上的doco喊出它实际上默认有一个一致性锁,那不是很好。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多