2012-08-09 16 views
5

Estoy trabajando en una aplicación usando EJB1.2. previamente funcionando bien, pero desde hace unos días estoy recibiendo siguiente excepciónEJB weblogic.ejb20.cache.CacheFullException

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..... 

Por ahora estoy cambiando valor de <max-beans-in-cache> en weblogic-ejb-jar.xml

estoy cambiando el valor anterior a <max-beans-in-cache>100000</max-beans-in-cache>

es el único solución para este tipo de excepción o podría haber un problema relacionado con los datos de la base de datos?

Respuesta

5

10000 es un valor bastante alto para max-beans-in-cache y del registro parece que la aplicación intentó realizar una llamada de hasta 85785 instancias del EJB.

Sugeriría algunas refactorizaciones en su código.

Su código está haciendo

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

es que esto es principalmente una operación de lectura? ¿O estás haciendo escrituras y lecturas simultáneas?

Puede refactorizar esto de 2 formas para reducir los gastos generales de EJB si se trata principalmente de operaciones de lectura.

1) Leer las recomendaciones de Oracle sobre el ajuste de la configuración de EJB y las opciones de base de datos para la concurrencia, en especial la lectura Parcialmente patrón

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

2) Si usted está haciendo principalmente lee - entonces no utilizar los EJB de entidad en todas. Utilice el patrón FastLaneReader que está utilizando una llamada JDBC directa para buscar los datos de SELECT, y puede escribir usando los EJB como en la actualidad. De esta manera, el max-frijol-en-caché se pueden reducir

Un ejemplo muy detallada puede obtenerse en el sitio Patrones del diseño de Sun

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