2012-08-09 3 views
5

私はEJB1.2を使用して1つのアプリケーションで作業しています。以前に、今私は<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は非常に高い値で、ログからはアプリケーションが最大85785個のEJBインスタンスを呼び出そうとしたようです。

私はあなたのコードでいくつかのリファクタリングをお勧めします。

あなたのコードは

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

をやっているが、これは主に読み出し動作ですか?または、同時に書き込みと読み取りを行っていますか?

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

1)あなたが主に行っている場合、並行性、特に読む-mostlyパターン

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

2)用のEJBの設定とデータベース・オプションのチューニングに関するOracleの推奨事項は、読み込み読む - その後で、エンティティEJBを使用してはいけませんすべて。直接JDBC呼び出しを使用してSELECT用のデータをフェッチするFastLaneReaderパターンを使用し、現時点でEJBを使用して書き込みを行うことができます。このように、max-beans-in-cacheが

を減少させることができる非常に詳細な例が

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

日デザインパターンのサイト上で与えられています