友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

borland传奇-第41章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



进而+会真正地转变成Windows的核心服务之一。未来Windows的组件模型应该是由 
的组件架构来接棒,因为Microsoft仍然需要一个提供虚拟执行环境的组件架构, 
以提供良好的Garbage Collection和Partitioning的功能,进一步和EJB竞争企业系 
统的延展性,而这个征兆可以从稍后讨论的发展看得出来。       
SUN的EJB组件模型   
经过了将近2年的时间后,SUN终于在最近推出了新一版的EJB 2。0功能规格,很快也 
被BEA和Borland的BES实现出来。SUN在EJB 2。0中提出了许多先进而复杂的功能,目 
的是为了大幅强化EJB作为企业核心组件架构的本钱,以便在企业系统中和Microsoft 
下一代的组件竞争。   
从SUN定义EJB的规范开始,就展现了其和不一样的观念。EJB一开始就非常重视 
Design Pattern和组件种类,例如Session Bean和Entity Bean各自负责不同的角色, 
再借助于Java的Garbage Collection,提供了成为企业信息系统组件必要的基础。但 
是,在EJB 1。x中,所有的Bean Instance之间的调用都是使用Remote Interface方式, 
因此在许多的应用方面付出了较大的开销,导致一些情况下执行效率不佳。在EJB 1。x 
中发展出了许多的Design Pattern来改善这种现象,例如鼓励使用Coarse…Grained对 
象,以减少网络Round…Trip和Bean之间的调用次数。   
在EJB 2。0中,SUN终于为改善这个问题而提出了Local Interface。所谓Local  
Interface,是指当Bean Instance在同一个EJB Container中时,EJB Container可以 
使用Local Interface调用来代替Remote Interface调用,这样可以增加3倍以上的对 
象启动效率。另外,SUN加入Local Interface功能的重要原因是为了支持EJB 2。0中 
大幅强化的CMP(Container Managed Persistence)功能。   
简单地说,EJB 2。0中的CMP允许程序员使用EJB Query Language来定义Bean之间的关 
系。只要程序员使用EJB QL定义了一个Bean和另外一个Bean的关系(Relationship), 
那客户端便可以在存取了主要Bean之后,再通过Bean定义的Finder或是Selector方法 
取得所有的从属Bean。如果读者不太了解这个意思,可以参考下面的示意图。在客户 
端建立主CMP之后,可以通过主CMP的Finder或是Selector方法取得所有的从属Bean, 
此时,主CMP便可以通过EJB QL向数据源查询所有相关的数据,再由EJB Container根 
据查询的数据自动建立从属Bean、并且和主CMP建立关联。如此一来,2。0的CMP可以 
免除程序员自行撰写存取数据和建立CMP的程序代码的麻烦,并且允许EJB Container 
使用最佳化的方式从数据源存取数据和建立CMP。为了增加这个过程的执行效率,EJB  
2。0的功能规范要求这种Bean必须支持Local Interface,当然,这也代表着这些会 
建立关系的Bean必须执行在一个相同的EJB Container中。EJB 2。0的CMP增加了功能 
和效率,但是也增加了Bean之间相互依靠的关系,这会影响EJB程序员在设计系统时 
的布局。此外,EJB 2。0的CMP虽然提供了这么强大的功能,但这也是不同厂商实现的 
EJB服务器执行效率有差距的地方。不同EJB服务器使用的实现方法的不同,会大大影 
响执行效率。这就是为什么SUN定义了ECperf标准来检验和评比EJB服务器的真正执行 
效率的原因,这稍后会谈到。   
因此,在EJB 2。0功能规格中,SUN定义了数个机制来增加EJB服务器的执行效率,这 
在EJB的架构已经很完整的情形下是很自然的下一步。当然,除了上述的功能外,EJB  
2。0功能规格也增加了MDB(Message Driven…Bean),MDB可以让程序员使用异步的方式 
传送信息,事实上把原本JMS的功能加入到EJB的功能规格中,是为了对抗Microsoft 
把MSMQ整合进+。请看EJB进化的示意图,我认为EJB 2。0最重要的进步便是执行效 
率、OR Mapping以及EJB的查询语言。EJB的查询语言开启了未来和JDO(Java Data  
Object)的整合,目的是和Microsoft在中定义的OPath和数据对象相互竞争,这 
在稍后也会再说明。至于OR Mapping,则是一个非常复杂的机制。它规范了Bean  
Instance和数据源之间的关系,这个标准可能会让许多小的EJB服务器厂商退出EJB市 
场,或是无法完整地支持EJB 2。0的功能规格。   
再看看Local Interface的意义。在EJB 1。x中,客户端调用Bean Instance时,在 
Container中Bean和Bean之间都是使用Remote Interface的方式进行调用,如下图所示:   
事实上,图中显示的启动模式是非常浪费资源的,因为图中的Bean都属于同一个 
Container之中,为什么要使用缓慢的Remote调用模式呢?因此在EJB 2。0中定义了 
Local Interface。如下图,现在只有在跨越网络或是跨越不同的Container时才需要 
使用Remote调用模式,这大大地改善了使用的资源和调用效率。   
更好的是在EJB 2。0中,一个Bean可以同时定义Remote Interface和Local Interface。 
如此一来,Bean的使用者和组合者(Assembler)可以更有弹性地分发和部署EJB Bean。 
在EJB 2。0中,Bean只要从EJBLocalObject继承下来,就可以拥有Local Interface的 
功能。例如程序员可以用下面的程序代码来提供Local Interface的功能。本质上, 
实现和定义Local Interface的方式和原本的Remote Interface非常类似,因此EJB 
的程序员可以很自然地学会这个新的EJB功能。   
public interface YourobjectClass extends EJBLocalObject  
public interface YourobjectClass extends EJBLocalHome      
了解了EJB 2。0增加的功能之后,现在就可以回到前面朋友询问我的问题了,为什么 
在EJB中没有看到任何像一样的线程模型之类呢?事实上这很简单,因为EJB是一 
个标准功能规格,并不包含如何实现的细节,在一般的EJB书籍中当然看不到类似的 
东西。而且,之所以有这么复杂的各种线程模型,是因为发展的包袱以及历史 
的因素所造成的。不过,这并不代表在EJB中没有线程模型的问题,因为EJB厂商如何 
实现EJB功能规格会深深地影响EJB服务器的效率。因此,线程模型反而是EJB程序员 
应该知道的东西,只是依据不同的厂商而有不同的结果,不像功能规格是由 
Microsoft定义的,也是由Microsoft实现的,因此会有一致的执行行为。   
EJB的线程模型应该是使用Object Per Client的模型。这个意思是说,EJB Container 
会为每一个请求的客户端建立一个独立的Bean服务。因此,如果EJB厂商没有特别进 
行最佳化的工作,那EJB使用的模型应该是类似中的STA,也就是说,一次只有一 
个Worker线程在Bean Instance中执行。下图就显示了这个架构,对每一个客户端就 
启动一对Worker Thread/Bean Instance。   
上图叙述的是正常的情形,那如果让两个客户端同时存取一个Bean Instance时,会 
发生什么情况呢?下图就显示了这个架构。在这个情形中,如果有两个客户端要同时 
存取Bean Instance,那EJB Container如何控制呢?在一般的EJB书籍中,似乎也没 
有看到和同步处理有关的范例,难道说,可以不进行任何的处理就让两个客户端同时 
存取吗?这当然不会,因为此时EJB Container就会进行管理,以STA的模式控制同步 
存取,因此客户端的存取必须依序(排队)来调用Bean Instance。   
这个情形也可以直接从Bean的实现程序代码中看出,例如下面的程序代码是EJB的标 
准范例Entity Bean的实现程序代码。请注意,在这个Bean类别中定义了数个private 
变量,并且在Bean的方法中直接存取和处理这些private变量,完全不需要考虑任何 
的同步处理机制,这就是因为EJB Container一般就是使用Object Per Client的模型 
以及类似的STA的线程控制模型。   
这只是一般的EJB Container可能会使用的模型,但有一些EJB服务器提供了最佳化的 
机制,可能会提供更为有效率的方式。下面的表格列出了/+和EJB在线程模型 
方面的比较:   
因为不同的应用程序服务器厂商实现而不同   
读者必须注意的是,上表并不代表+是比较好的,只能说+提供了较多的选择, 
可以让有经验的程序员调整执行效率。但是,相对地也让情形复杂了许多,而且+ 
的MTA线程模型也不容易实现。   
正由于EJB功能规格会因为不同的EJB厂商实现而有不同,因此,除了前面提到的EJB  
2。0中CMP和OR Mapping会影响EJB服务器的执行效率之外,如果再结合线程模型和对 
象建立的技术,那下面列出的问题是影响执行效率的重要因素:   
●如何实现和控制Worker Thread。事实上这就是EJB Server中Thread Pooling的机制 
●如何实现和控制EJB Bean Instance。这就是EJB Server中Object Pooling的机制   
为了让EJB服务器有公平的效率比较基础,SUN定义了ECperf标准让使用者能够用来评 
量各家EJB服务器的执行效率,以避免各说各话的情形。从这一点也可以看出,SUN现 
在开始注重EJB服务器的执行效率因素了。   
为什么我说线程模型会因为不同的EJB服务器而有不同呢?现在让我们以实例来看看 
EJB服务器的行为。下图是我使用4个Delphi建立的客户端应用程序,并且使用SIDL技 
术来调用Borland Application Server…BAS中的一个Stateless Session Bean的结果。 
从图中可以明显地看到,即使是在有4个客户端的情形中,BAS仍然使用了MTA模式, 
只建立一个Stateless Session Bean,并且让4个Worker线程同时存取,因此执行效 
率非常高,使用的内存资源也非常少。   
而下图则使用4个Delphi客户端应用程序调用Stateless +对象(使用Both线程模型), 
从图中可以看到,+使用Object Per Client的模式,建立了4个+对象服务4个 
客户端,虽然执行效率也非常高,但是使用的资源稍比BAS多。   
接下来,再让我们讨论一下未来Microsoft的组件模型以及SUN的组件模型的演进趋势。     
Data Access Technology   
在未来,Microsoft和SUN的组件模型大概都会强调数据存取的技术,因为从前面讨论 
的EJB 2。0 CMP的内容中我们可以知道,现在SUN已经在为对象和数据之间建立连接的 
技术了,而未来的JDO技术将进一步紧密结合数据对象的观念,让程序员面对的所有 
东西都是对象,不再有数据和对象不一样的观念和使用方式。   
不过别以为Microsoft只会呆在原地,在PDC 2002中Microsoft已经宣示了未来ADO 
的发展方向。ADO未来将会结合数据和组件的观念,让的程序员以对象的观 
念来代表数据,就像EJB中的CMP/BMP一样。如此一来,的程序员可以像EJB一样 
声明代表数据源中数据的数据类型,并且使用以XML格式封装的
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!