2014-09-16 4 views
4

На высоком уровне у меня есть класс MemcachedPoolService, который имеет два метода: getClientInstance() и returnClientInstance (клиент). Как и ожидалось, getClientInstance() возвращает экземпляр MemcachedClient (spymemcachced) вызывающему, а returnClientInstance (клиент) возвращает MemcachedClient обратно в пул. MemcachedPoolService должен быть доступен другим службам @Stateless (впрыснутым), которым всем нужен доступ к Memcached.Какую бобу я должен использовать для обеспечения доступа к пулу объектов в EJB?

В настоящее время я 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 [email protected] - could not 
obtain lock within 5000MILLISECONDS 

Что бы лучший способ настроить мой MemcachedPoolService (и мое веб-приложение в целом) для производственной среды, чтобы избежать получения параллельных исключений таймаута?

ответ

8

Прежде всего, MemcachedPoolService - это служба без состояния, и, следовательно, если вы не делаете никаких обновлений db, требующих согласованности (Thats, почему это @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(){} 
} 
+0

потрясающе. изменив LockType на READ на класс, исправленный. большое спасибо! – daveashworth

+0

Благодарим вас, не было бы здорово, если бы doco на singleton выкрикнул, что на самом деле у него по умолчанию установлена ​​блокировка последовательности. – Spence