tutorial transacciones modelo español entre ejemplo diferencia desarrollo curso con bean aplicaciones java jboss ejb memcached spymemcached

transacciones - pojo java



¿Qué tipo de bean debería usar para proporcionar acceso a un grupo de objetos en EJB? (1)

En un nivel alto, tengo una clase MemcachedPoolService que tiene dos métodos: getClientInstance () y returnClientInstance (cliente). Como era de esperar, getClientInstance () devuelve una instancia de MemcachedClient (spymemcachced) a la persona que llama, y ​​returnClientInstance (client) devuelve un MemcachedClient de vuelta al grupo. MemcachedPoolService debe estar disponible para otros servicios @Stateless (inyectados) que necesitan acceso a Memcached.

Actualmente tengo MemcachedPoolService marcado como @Singleton, pero recibo el siguiente error cuando más de un cliente intenta acceder a la aplicación:

[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

¿Cuál sería la mejor manera de configurar mi MemcachedPoolService (y mi aplicación web en general) para un entorno de producción para evitar las excepciones simultáneas de tiempo de espera?


Primero y más importante, MemcachedPoolService es un servicio sin estado, y por lo tanto, si no está haciendo ninguna actualización de db que requiera consistencia (Es por eso que es @Singleton de todos modos, de lo contrario usaría @Stateless), simplemente marque la clase como

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

o

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

si eso no es una opción, entonces:

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