WebLogic Server中CMP实体bean的性能调优[4] 软件测试
只读并发
最后一个并发策略是read-only并发。如果数据库中的某些表包含很少或从未被更改过的数据,那么就很有必要将CMP bean声明为只读。服务器仍然为每个事务激活一个新的bean实例,所以请求是并行处理的;它不会每次都调用ejbLoad(),但是根据read-timeout-seconds参数的值周期性地调用。这为您的应用程序带来了显著的性能提升,因为SQL选择只进行一次(第一次访问实体bean时),然后就被缓存起来,在后面的事务中重用。
WebLogic Server 8.1 SP2之前版本中的一个特殊功能是,即使bean被部署为只读,开发人员仍然可以对该bean的实例进行create和remove操作。从8.1 SP2开始,这个功能在默认情况下已被禁用,但是如果您需要,可以通过在weblogic-cmp.jsr.xml中将allow-readonly-create-and-remove元素设置为true来打开它。
也有一种明确禁用只读实体bean的方法。该禁用操作强制在下一次事务开始时从数据库中刷新bean实例,即使读取时限还没过去。您可以将其看作冲洗实例缓存。可以使特定bean的一个特定实例,任何实例子集,或者给定bean的所有实例无效。要想调用invalidate()方法,您可能需要将bean的home或local home分别转换为CachingHome或CachingLocalHome。下面的代码说明了如何实现这一点:
Object o = context.lookup("MyBeanCMP");
// cast to CachinHome for remote interface or CachingLocalHome
// for local
CachingHome cachingHome = (CachingHome)o;
// invalidate particular instance by passing primary key value
cachingHome.invalidate(pk);
// invalidate any subset of bean instances by passing collections
// of primary keys
Collection pks = Array.asList(new Object[]{pk1, pk2, ...., pkN});
cachingHome.invalidate(pks);
// or invalidate all instances currently cached
cachingHome.invalidateAll();
当表中的数据准静态时(比如,如果它按照批处理过程每天更改一次)进行显式的无效操作很有用。这种情况下,您可以将相应的bean部署为只读,并且设置一个较大的读取超时值,然后,当批处理过程结束时,为这些实体bean调用invalidateAll()。
您可以通过在weblogic-ejb-jar.xml部署描述符中entity-cache一节中设置concurrency-strategy元素,为每个CMP bean指定一种并发策略。如果没有指定并发策略,WebLogic Server默认使用数据库并发。
性能改善策略