caching - EJB weblogic.ejb20.cache.CacheFullException

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

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

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

这是这种异常的唯一解决方案吗?或者数据库中可能存在与数据相关的问题吗?

最佳答案

10000 对于 max-beans-in-cache 来说是一个相当高的值,从日志来看,应用程序似乎试图调用最多 85785 个 EJB 实例。

我建议对您的代码进行一些重构。

你的代码正在做

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

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

如果它主要执行读取操作,您可以通过两种方式对其进行重构,以减少 EJB 开销。

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

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

2) 如果您主要进行读取操作 - 那么根本不要使用实体 EJB。使用 FastLaneReader 模式,该模式使用直接 JDBC 调用来获取 SELECT 的数据,并且您可以像目前一样使用 EJB 进行写入。这样就可以减少max-beans-in-cache

Sun Design Patterns 站点上给出了非常详细的示例

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

关于caching - EJB weblogic.ejb20.cache.CacheFullException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882509/

相关文章:

java - Web 模块的依赖项未通过 Eclipse Kepler 部署在 Weblogic 服务器 10.3.6 上

ios - iOS 可以只删除我的应用程序缓存文件夹的一部分吗?

java - 多线程:操纵同一对象的不同字段的线程

asp.net - 如何按年龄设置 *.js 和 *.css 缓存过期时间? web.config 中的 <clientCache> 设置不起作用

sql-server - SQL 服务器 : find out if a db table has changed (using entity framework)

java - 如何更改 TomEE/OpenEJB 中的 EJB 计时器线程池大小?

java - 随机使用 Weblogic 和第 7 层的 Java Webservice 中的 Policy Falsified 错误

c# - 日期时间从 WebLogic SOAP 服务更改为 WCF 应用程序

java - session bean 返回错误值

java - 加载 jar 时出错