2012-08-09 13 views
5

Pracuję nad jedną aplikacją przy użyciu EJB1.2. poprzednio działa dobrze, ale od kilku dni otrzymuję następujący wyjątekEJB 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..... 

Na razie jestem zmieniającej się wartości <max-beans-in-cache> w weblogic-ejb-jar.xml

ja zmienia powyższą wartość <max-beans-in-cache>100000</max-beans-in-cache>

jest on jedyny rozwiązanie dla tego rodzaju wyjątku lub czy może istnieć problem związany z danymi z bazy danych?

Odpowiedz

5

10000 jest dość wysoką wartością dla max-beans-in-cache iz logu wynika, że ​​aplikacja próbowała wykonać wywołanie do 85785 wystąpień EJB.

Sugerowałbym wprowadzenie zmian w kodzie.

Kod robi

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

Czy jest to przede wszystkim operacja odczytu? Czy robisz jednoczesne pisanie i czytanie?

Można to zmienić na 2 sposoby, aby zmniejszyć narzuty EJB, jeśli chodzi głównie o operacje odczytu.

1) Czytaj rekomendację Oracle na dostrojenie ustawień EJB i opcji bazy danych dla współbieżności, zwłaszcza wczytywanie Mostly wzór

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

2) Jeśli są głównie robi czyta - wtedy nie używaj EJBs jednostki na wszystko. Użyj wzorca FastLaneReader, który używa bezpośredniego wywołania JDBC, aby pobrać dane dla SELECT, i możesz robić zapisy przy użyciu EJB jak obecnie. W ten sposób, MAX-fasola-in-cache może być zmniejszona

Bardzo szczegółowy przykład podany jest na wzorcach Sun Site Design

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