EJB weblogic.ejb20.cache.CacheFullException

Vip*_*pul 5 caching ejb weblogic weblogic8.x

我正在使用EJB1.2处理一个应用程序.以前运行正常,但从过去几天我得到以下异常

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.....
Run Code Online (Sandbox Code Playgroud)

现在我正在改变<max-beans-in-cache>in的价值weblogic-ejb-jar.xml

我正在将上述值更改为 <max-beans-in-cache>100000</max-beans-in-cache>

它是这种异常的唯一解决方案,还是数据库中存在与数据相关的问题?

Jos*_*seK 5

对于max-beans-in-cache日志来说,10000是非常高的值,应用程序试图调用多达85785个EJB实例.

我建议你在代码中进行一些重构.

你的代码正在做

com.nextjet.enterprise.locationcode.locationcode.LocationCode_v2epgs_ELOImpl
.getLocationCodeData()
Run Code Online (Sandbox Code Playgroud)

这主要是读操作吗?或者您正在同时写入和读取?

如果主要执行读取操作,则可以通过两种方式重构此方法以减少EJB开销.

1)阅读Oracle关于调整EJB设置和数据库选项以进行并发的建议,尤其是Read-Mostly模式

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

2)如果您主要进行读取 - 那么根本不使用实体EJB.使用使用直接JDBC调用的FastLaneReader模式来获取SELECT的数据,并且您可以使用EJB进行写入.通过这种方式,可以减少max-beans-in-cache

Sun Design Patterns网站上给出了一个非常详细的示例

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