EJB weblogic.ejb20.cache.CacheFullException

Я работаю над одним приложением, используя EJB1.2. ранее работал нормально, но из последних нескольких дней я получаю следующее исключение

Exception in ejbLoad:: weblogic.ejb20.cache.CacheFullException: size=85783, target=5000, incr=1 at weblogic.ejb20.cache.EntityCache$SizeTracker.shrinkNext(JI)Lweblogic.ejb20.cache.EntityCache$MRUElement;(EntityCache.java:438) at weblogic.ejb20.cache.EntityCache.put
(Ljavax.transaction.Transaction;Lweblogic.ejb20.cache.CacheKey;Ljavax.ejb.EntityBean;Lweblogic.ejb20.interfaces.CachingManager;)V(EntityCache.java:141) at weblogic.ejb20.manager.DBManager.getReadyBean(Ljavax.transaction.Transaction;Ljava.lang.Object;)Ljavax.ejb.EntityBean;(DBManager.java:332) at 
    weblogic.ejb20.manager.DBManager.preInvoke(Lweblogic.ejb20.internal.InvocationWrapper;)Ljavax.ejb.EnterpriseBean;(DBManager.java:249) at 
    weblogic.ejb20.internal.BaseEJBLocalObject.preInvoke(Lweblogic.ejb20.internal.InvocationWrapper;)Lweblogic.ejb20.internal.InvocationWrapper;(BaseEJBLocalObject.java:228) at weblogic.ejb20.internal.EntityEJBLocalObject.preInvoke(Lweblogic.ejb20.internal.MethodDescriptor;Lweblogic.security.service.ContextHandler;)Lweblogic.ejb20.internal.InvocationWrapper;(EntityEJBLocalObject.java:72) at com.nextjet.enterprise.locationcode.locationcode.LocationCode_v2epgs_ELOImpl.getLocationCodeData()Lcom.nextjet.enterprise.locationcode.LocationCodeData;(LocationCode_v2epgs_ELOImpl.java:28) at com.nextjet.enterprise.locationcode.locationcodemanager.LocationCodeManagerBean.loadShippingAddress(Ljava.lang.Long;Ljava.lang.String;)Lcom.nextjet.enterprise.locationcode.LocationCodeView;(LocationCodeManagerBean.java:538) at com.nextjet.enterprise.locationcode.locationcodemanager.LocationCodeManagerBean.doSearchShippingAddresses(Ljava.lang.String;)Lcom.nextjet.enterprise.locationcode.LocationCodeSearchResult;(LocationCodeManagerBean.java:514) at com.nextjet.enterprise.locationcode.locationcodemanager.LocationCodeManagerBean.lookupAccountShipping.....

Сейчас я меняю значение <max-beans-in-cache> в weblogic-ejb-jar.xml

Я изменяю вышеуказанное значение на <max-beans-in-cache>100000</max-beans-in-cache>

Это единственное решение для такого рода исключений или может быть проблема, связанная с данными из базы данных?

1 ответ

10000 является довольно высоким значением для max-beans-in-cache и из журнала кажется, что приложение пыталось сделать вызов до 85785 экземпляров EJB.

Я бы предложил рефакторинг в вашем коде.

Ваш код делает

com.nextjet.enterprise.locationcode.locationcode.LocationCode_v2epgs_ELOImpl
.getLocationCodeData()

Это в основном операция чтения? Или вы делаете одновременные записи и чтения?

Вы можете изменить это двумя способами, чтобы уменьшить накладные расходы EJB, если он в основном выполняет операции чтения.

1) Прочитайте рекомендации Oracle по настройке параметров EJB и параметров базы данных для параллелизма, особенно шаблон Read-Mostly

http://docs.oracle.com/cd/E13222_01/wls/docs81/ejb/entity.html

2) Если вы в основном читаете, то вообще не используйте Entity EJB. Используйте шаблон FastLaneReader, который использует прямой вызов JDBC для извлечения данных для SELECT, и вы можете делать записи, используя EJB-компоненты, как в настоящее время. Таким образом, max-beans-in-cache может быть уменьшен

Очень подробный пример приведен на сайте Sun Design Patterns.

http://java.sun.com/blueprints/patterns/FastLaneReader.html

Другие вопросы по тегам