2012-08-09 9 views
5

Tôi đang làm việc trên một ứng dụng bằng EJB1.2. trước đây chạy tốt nhưng từ vài ngày qua tôi nhận được sau ngoại lệEJB 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..... 

Để bây giờ tôi đang thay đổi giá trị của <max-beans-in-cache> trong weblogic-ejb-jar.xml

tôi thay đổi giá trị ở trên để <max-beans-in-cache>100000</max-beans-in-cache>

là nó chỉ giải pháp cho loại ngoại lệ này hoặc có thể có một vấn đề liên quan đến dữ liệu từ cơ sở dữ liệu?

Trả lời

5

10000 là giá trị khá cao đối với max-beans-in-cache và từ nhật ký có vẻ như ứng dụng đã cố thực hiện cuộc gọi tới 85785 phiên bản EJB.

Tôi sẽ đề xuất một số phép tái cấu trúc trong mã của bạn.

Mã của bạn đang làm

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

Đây có phải là chủ yếu một hoạt động đọc? Hay bạn đang viết và đọc đồng thời?

Bạn có thể cấu trúc lại bằng 2 cách để giảm chi phí EJB nếu chủ yếu là thực hiện các thao tác đọc.

1) đọc giới thiệu của Oracle trên điều chỉnh các thiết lập EJB và các tùy chọn cơ sở dữ liệu cho đồng thời, đặc biệt là Read-Chủ yếu là mô hình

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

2) Nếu bạn đang chủ yếu làm đọc - sau đó không sử dụng EJB Entity tại tất cả các. Sử dụng mẫu FastLaneReader đang sử dụng một cuộc gọi JDBC trực tiếp để tìm nạp dữ liệu cho SELECT và bạn có thể viết bằng cách sử dụng các EJB như hiện tại. Bằng cách này, max-đậu-in-cache có thể được giảm

Một ví dụ rất chi tiết được đưa ra trên Patterns Sun Thiết kế trang web

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