优化Entity Beans的七条守则将这些references定义为一个实例变量。 在setEntityContext中搜寻它们(对于session bean,相应地使用setSessionContext方法)。 setEntityContext方法仅仅在一个bean被实例化时被调用,因此在这时候搜寻所有需要的references并不太耗费资源。要避免在其它任何方法中搜寻references,特别是对于数据库访问方法、ejbLoad和ejbStore。这样的方法会被频繁地调用,这会导致大量的时间被无谓地耗费在搜寻的调用上。 定位另一个entity bean的调用也是相当耗费资源的。虽然这样的调用不一定适合bean初始化时的象setEntityContext这样的回叫,但是我们还是需要在合适的地方将搜寻的references结果保存在cache中。如果这个reference仅对当前的实体有效,你需要在实例被重新激活以描述另一个实体前清除references。这需要在ejbActivate方法中完成。 五、总是准备好你的SQL语句 在所有代码中涉及到对关系型数据库的访问总是使用SQL是一种有效的优化手段。因为对于绝大多数的当前EJB执行都使用关系型数据库,对于bean的作者需要编写数据库访问代码的EJB部署,这条规则是非常有效的。 因为每一个SQL语句都必须由数据库进行处理,数据库需要花费时间在执行SQL语句前对其进行编译。然而,对于一个性能良好的关系型数据库,会将语句和编译结果保存在cache中,对于新的SQL语句,它会将其与cache进行比照,以获得它的编译结果。然而,为了得用这种优化手段,新的语句必须完成与老的语句匹配。 未准备好的语句 对于未准备好的语句,数据和语句被传递到同一个字符串中,尽管语句可能与后来的调用完成一样,但是数据不匹配,这使得这种优化手段失去作用。 已准备好的语句 对于已准备好的语句,只将没有数据的语句传递到数据库,这使用从cache中获得编译结果成为可能。 在使用语句时,数据在其后被传递,而语句得以执行。通常地,这个语句必须经过编译,但是对于后来的语句,它可能与cache匹配,而不需要再被重新编译。这项技术具有较高的语句cache命中率(接近100%),可以最大限度地减少语句的编译。对于小型的数据库访问,这可以减少将近90%的执行时间。 六、完全地关闭所有的语句 当在BMP执行中处理数据库访问代码时,在完成数据库访问调用后要记得关闭语句。每一个未关闭的语句对应着数据库一个开启的光标。(尽管垃圾搜集器最后会对开启的语句进行检查,并在垃圾搜集(GC)时间将其关闭,但是你不能控制这样的一个时间。)保持语句开启会导致数据库过多的开启光标,这会浪费数据库的资源,而这些资源本来是可以用来改善数据库性能的。 同样,关闭语句时必须确保捕获所有的另外。在关闭一个语句时产生的另外必须不会导致另一条语句的被忽略或是保持开启状态。 七、避免死锁 应用程序不通过代码直接控制调用ejbStore(或其它CMP的等价物)的时间。何时执行这个调用是由容器决定的,这通常是在一个事务的最后进行。 如果在一个事务中涉及到一个复合的entity beans或者是复合的实体,调用ejbStore的次序并没有被定义。这也就意味着用户没有控制与那些实体相关的数据库记录的访问/锁定的次序。当涉及到多个数据表或数据行时,这很可能会导致死锁。 乐观地看,理想的情况是在容器会控制EJB中的访问和锁定,只使得容器会解决死锁问题,而开发者和部署者将不必担心这一类的问题。但是,不幸的是,目前可用的商业应用服务器很少有能很好地处理数据库的锁定问题的,对于复杂的entity bean部署,部署者将不得不自行解决死锁问题。 可适用的规则是(至少在我们编写这篇文档时是这样):我们可以假定容器会按照事务中最初调用事务方法的同样的次序来调用数据库访问。举例来说:如果在一个entity bean EB1中有一个名为m1的事务方法,而在另一个entity bean EB2中有一个名为m2的事务方法。如果在同一个事务中,EB1.m1在EB2.m2之前被访问,你也可以假定EB1.ejbLoad会在EB2.ejbLoad被调用,同样,EB1.ejbStore会在EB2.ejbStore之前被调用。这意味着,与EB1相应的实体或数据库记录会在EB2之前被锁定。为了避免死锁,必须确保在整个应用程序中,对于任何事务EB1总是在EB2之前被调用。 我们可以肯定,应用程序服务器将会变得越来越聪明,他将会知道如何组织对数据库的访问,而开发者和部署者将不再去小心翼翼地处理访问次序。然而,就象在下面这个例子中那样严格处理调用顺序的代码至少可以保证在目前的服务器上更好地工作。 Vehicle和Car bean的源代码可以从这里下载,它使用了这儿的绝大多数的规则,你也可以将其作为将来entity bean开发的基础和模板。(要下载jar文件,右击这个连接,并选择“目标另存为”。) 展望 当entity bean的开发者和部署者有效地利用这些规则后,可以大大地提高bean的性能和适应性,使得它们可以适应不同的持久存储类型。这给了部署者以更多的选择。也就是说 -- 一次编写,处处使用,而且是有效率地处处使用。 上一篇:Enterprise Bean 下一篇:Informix的用户权限管理 更多相关文章
|
推荐文章
精彩文章
|