7

私はEJB1.2を使用して1つのアプリケーションに取り組んでいます。以前は正常に実行されていましたが、過去数日から次の例外が発生しています

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

今のところ私はの値を変更してい<max-beans-in-cache>ますweblogic-ejb-jar.xml

上記の値をに変更します<max-beans-in-cache>100000</max-beans-in-cache>

これがこの種の例外の唯一の解決策ですか、それともデータベースからのデータ関連の問題がある可能性がありますか?

4

1 に答える 1

5

10000 は非常に高い値でmax-beans-in-cacheあり、ログからは、アプリケーションが EJB の最大 85785 インスタンスを呼び出そうとしたようです。

コードのリファクタリングをお勧めします。

あなたのコードはやっています

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

これは主に読み取り操作ですか? それとも、書き込みと読み取りを同時に行っていますか?

これを 2 つの方法でリファクタリングして、主に読み取り操作を行う場合、EJB のオーバーヘッドを削減できます。

1) 同時実行のための EJB 設定とデータベース オプションのチューニングに関する Oracle の推奨事項、特に Read-Mostly パターンを読む

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

2) 主に読み取りを行っている場合は、エンティティ EJB をまったく使用しないでください。JDBC の直接呼び出しを使用して SELECT のデータをフェッチする FastLaneReader パターンを使用すると、現在のように EJB を使用して書き込みを行うことができます。このようにして、max-beans-in-cache を減らすことができます。

非常に詳細な例が Sun Design Patterns サイトに掲載されています。

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

于 2012-08-13T08:34:52.063 に答える