电话:0731-83595998
导航

Java进阶:优化EntityBeans的七条守则

来源: 2017-12-23 16:32

 百度广告

Entity beans提供了一个清楚的模型以描述应用程序中持久稳固的事务对象以及它们的设计。在面向对象的模型中,简单的Java对象通常被直接地描述,但是并不包括事务处理的功能,这通常需要使用事务对象来完成。Entity beans不仅仅考虑到模型中的简单类型,它也考虑到面向对象模型中的事务模型,它将所有的复杂的工作都交给了bean和容器服务。这使得应用程序可以象使用通常的Java对象那样来应用它。在保持存储数据的公开性和灵活性的同时,容器会对entity beans进行优化,而我们只需要考虑如何部署它。 
探索各种优化方案
讨论如何避免一些已知的问题

一、尽可能地使用容器持久化管理
另外一个优化的实例是对find方法的调用。根据对一个entity的参考搜寻一个entity,而接下去最可能的情况是使用这个entity。这通常包括两个数据库
将记录的数据读入到内存中

二、编写同时支持Bean持久化管理和容器持久化管理的代码

这个模型听起来很容易实现,但是事实上存在一些问题:
这样做意味着子类必须同时继承CMP超类和BMP超类。此外,BMP子类还必须继承它的直接的CMP执行。这导致了多重的类的继承,而这样的继承是不被Java程序所允许的。

没有简单的方法支持改变的持久化执行
要解决这些问题,你可以对目前的模型作一些改变。对所有BMP类抽象出一个辅助类以执行基本的持久化代码。这样的辅助类被称之为数据访问对象(DAO)。你可以通过对DAO接口的实现产生多个DAO子类,然后在实际应用时选择合适的DAO子类进行实例化。有许多方法可以选择合适的DAO子类进行实例化,例如,通过读取环境变量或是判断DB类型。

使用这个模型,CMP执行和包含这个执行的DAO可以很方便地被继承;除了BMP类外,所有的东西都可以被执行。因为这些BMP类包含了一些具有代表性的代码的框架,对于第一个entity bean它看上去都是差不多的,你可以很容易地将一个bean拷贝到另一个而只需作很小的改动。而最终,你甚至可以使用工具来自动完成这项工作。

三、在ejbStores中尽量减少对数据库的访问
然而在使用BMP来部署bean时,为缓冲区维持一个dirty标志是一种很有效的做法。对缓冲区的所有改变都会对dirty标志进行设置,ejbStore将会对这个标志进行检查。如果dirty标志未被设置,这意味着缓冲区没有被改变,ejbStore将不执行所有的开销巨大的对数据库的访问。这个决窍对于那些经常对数据库进行查询而不是作真正的改变的bean尤为有效。而这通常组成了一个应用程序中的绝大部分(例如,查找一个表)。
完全从一种科学的观点来看,EJB的并不需要处理系统级的问题,包括对缓冲区的处理。但是不幸的是,使用BMP的EJB 1.1并不提供这种系统优化的选择,因此bean的还是不得不手工对dirty标志进行设置。

四、对于调用的查找和定位的总是使用Reference Cache
将这些references定义为一个实例变量。 ||| 
setEntityContext方法仅仅在一个bean被实例化时被调用,因此在这时候搜寻所有需要的references并不太耗费资源。要避免在其它任何方法中搜寻references,特别是对于数据库访问方法、ejbLoad和ejbStore。这样的方法会被频繁地调用,这会导致大量的时间被无谓地耗费在搜寻的调用上。

五、总是准备好你的SQL语句
因为每一个SQL语句都必须由数据库进行处理,数据库需要花费时间在执行SQL语句前对其进行编译。然而,对于一个性能良好的关系型数据库,会将语句和编译结果保存在cache中,对于新的SQL语句,它会将其与cache进行比照,以获得它的编译结果。然而,为了得用这种优化手段,新的语句必须完成与老的语句匹配。
对于未准备好的语句,数据和语句被传递到同一个字符串中,尽管语句可能与后来的调用完成一样,但是数据不匹配,这使得这种优化手段失去作用。
对于已准备好的语句,只将没有数据的语句传递到数据库,这使用从cache中获得编译结果成为可能。 

六、完全地关闭所有的语句
同样,关闭语句时必须确保捕获所有的另外。在关闭一个语句时产生的另外必须不会导致另一条语句的被忽略或是保持开启状态。

七、避免死锁
如果在一个事务中涉及到一个复合的entity beans或者是复合的实体,调用ejbStore的次序并没有被定义。这也就意味着用户没有控制与那些实体相关的数据库记录的访问/锁定的次序。当涉及到多个数据表或数据行时,这很可能会导致死锁。
可适用的规则是(至少在我们编写这篇文档时是这样):我们可以假定容器会按照事务中最初调用事务方法的同样的次序来调用数据库访问。举例来说:如果在一个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文件,右击这个连接,并选择"目标另存为"。)

展望

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端