WebLogic Server中CMP实体bean的性能调优[8] 软件测试
WebLogic Server 9.0中的改进
在WebLogic Server 9.0中,对使用乐观并发的缓存bean进行的显式缓存禁用被归档,并且与只读bean一致。(比如,bean home或远程主接口可被缓存到上面调用的CachingHome或CachingLocalHome和invalidate()方法中)。此外,read-timeout-seconds参数适用于用乐观并发部署的bean。开发人员还对集群中的bean实例无效化有更多的控制。默认情况下,当在一个集群中部署具有乐观并发策略的bean,并且该集群的一个成员更新该bean时,WebLogic Server会试图使该集群的所有节点中的bean的所有副本无效。该无效化使您避免了乐观并发故障,但是会影响性能,因为它是一项资源密集型操作。可通过在weblogic-cmp-jar.xml中将cluster-invalidation-disabled设置为true来防止EJB容器使集群中的bean副本无效。
为实体Bean选择最佳缓存大小
既然您理解了事务间的缓存是如何工作的,下面就让我们讨论一下选择最佳缓存大小方面的重要话题。默认情况下,每个实体bean都定义有一个大小为1000的缓存。缓存大小由weblogic-ejb-jar.xml部署描述符中的max-beans-in-cache元素控制。我发现该名称有些令人误解,因为根据并发策略的不同,WebLogic Server保存无状态的实体bean实例池(采用数据库并发策略和排他性并发策略,且事务间缓存被禁止的情况下)或者(只读、乐观或排他性并发策略,且事务间缓存启用的情况下)保存具有保留字段值的bean的真正缓存,从而无需从数据库中重新加载bean的状态就可使用。后一种情况更有趣。有人可能会想,更改缓存大小只影响具有实体bean的操作的性能;缓存越大,在缓存中发现需要的特定实体bean实例的机会就越大。基本上是这样的,但是如我下面会讲到的那样,另一个重要因素会影响缓存大小的选择。
多版本化和事务的因素
确定实体bean缓存大小的推动因素之一(可能不太明显)是当事务使用实体bean时,它们在事务的执行期间被实际加载和“固定”在实体缓存中,即使调用者不在修改实体bean实例而仅是从中读取值。比如,想象一下,一个会话或MDB bean中的代码在一个实体bean “Person”上执行一个finder方法,然后在返回的集合上迭代。
...
Collection persons = personLocalHome.findSomething();
for (Iterator iter = persons.iterator(); iter.hasNext();) {
PersonLocal person = (PersonLocal)iter.next();
Long id = person.getId();
// do something: log, send email, etc
...
}
...
如果findSomething()方法返回比max-beans-in-cache中规定的值更多的对象,您的应用程序将在迭代器得到N+1个对象时(N为当前实体缓存大小)获得一个令人不愉快的(并且很可能是不想要的)CacheFullException。这可能看上去很重要,因为一般大家都认为finder不应返回很大的集合。但是不要忘记默认情况下WebLogic实体缓存是多版本的,这意味着如果多个事务请求同一个实体bean实例,那么会在缓存中创建多个版本(每个事务一个);从唯一对象的角度来看这可能极大地降低了缓存容量。
文章来源于领测软件测试网 https://www.ltesting.net/