2012-08-09 5 views
5

EJB1.2를 사용하는 하나의 응용 프로그램에서 작업하고 있습니다. 이전에 잘 실행하지만 지난 몇 일에서 나는 <max-beans-in-cache>100000</max-beans-in-cache>EJB weblogic.ejb20.cache.CacheFullException

에 위의 값을 변경하고 weblogic-ejb-jar.xml

<max-beans-in-cache>의 지금은 변화하고 값에 대해 다음과 같은 예외

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

을 얻고 것은 그것에게 유일한입니다 이런 종류의 예외에 대한 해결책이나 데이터베이스와 관련된 데이터가있을 수 있습니까?

답변

5

10000은 max-beans-in-cache에 대해 상당히 높은 값이며 로그에서 응용 프로그램이 최대 85785 개의 EJB 인스턴스를 호출하려고했음을 나타냅니다.

코드에서 일부 리팩터링을 제안합니다.

코드는

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

이 주로 읽기 작업입니다을하고있다? 아니면 동시에 읽고 쓰는 중입니까?

주로 읽기 작업을 수행하는 경우 EJB 오버 헤드를 줄이려면이 방법을 2 가지 방법으로 리펙토링 할 수 있습니다.

1) EJB 설정 및 동시성에 대한 데이터베이스 옵션, 특히 읽기 대부분 패턴

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

2) 주로 수행하는 경우 읽기 조정에 오라클의 추천을 읽기 - 다음에서 엔티티 EJB를 사용 해달라고을 모든. 직접 JDBC 호출을 사용하여 SELECT 용 데이터를 페치하는 FastLaneReader 패턴을 사용하면 현재 EJB를 사용하여 쓰기를 수행 할 수 있습니다. 이러한 방법으로, 최대 콩 -에 - 캐시는

매우 상세한 예는 일 디자인 패턴 사이트

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

에 기재되어 있습니다

을 감소시킬 수있다