2012-08-09 12 views
5

Sto lavorando su un'applicazione utilizzando EJB1.2. in precedenza in esecuzione bene, ma da questi ultimi giorni sto ricevendo seguente eccezioneEJB 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..... 

Per valore ora sto cambiando di <max-beans-in-cache> in weblogic-ejb-jar.xml

Sto cambiando il valore sopra per <max-beans-in-cache>100000</max-beans-in-cache>

è l'unico soluzione per questo tipo di eccezione o potrebbe esserci un problema relativo ai dati dal database?

risposta

5

10000 è un valore piuttosto elevato per max-beans-in-cache e dal registro sembra che l'applicazione abbia tentato di effettuare una chiamata per un massimo di 85785 istanze dell'EJB.

Vorrei suggerire alcuni refactoring nel codice.

Il codice sta facendo

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

è questo è principalmente un'operazione di lettura? O stai facendo scritture e letture simultanee?

È possibile eseguire il refactoring in 2 modi per ridurre i costi generali EJB se si eseguono principalmente operazioni di lettura.

1) Leggere la raccomandazione di Oracle sulla messa a punto delle impostazioni EJB e le opzioni di database per la concorrenza, in particolare la lettura Per lo schema

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

2) Se si sta principalmente facendo leggono - allora non utilizzare gli EJB di entità a tutti. Utilizzare il modello FastLaneReader che utilizza una chiamata JDBC diretta per recuperare i dati per SELECT, e allo stato attuale è possibile eseguire scritture utilizzando gli EJB. In questo modo, i max-fagioli-a-cache possono essere ridotti

Un esempio molto dettagliato è riportato sul sito Patterns disegno di Sun

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