China. coM 第15章COM+应用程序 当我们伴随着 Windows2000和ASP30进入21世纪时,发现微软在企业应用程序开发方面 扩展和改进了对开发人员来说非常有用的工具和技术。在前面两章中讨论了如何使用ASP和 COM构建web应用程序。通过使用功能强大的IS,使用所选择的程序语言开发COM组件,使 eb应用程序远远超越仅使用ASP脚本创建互相链接的简单网页的水平。可以开发安全高效的 基于组件的可扩展应用程序,以此来支持面向数以千计用户的业务处理 Windows2000中显著的变化是微软的事务服务器( Microsoft transaction Server,MTS)得 以改善并融入COM运行期中,当然,除此以外还有许多其他新的特性和改进。每一项改进都 可以使我们的应用程序比以前更为强大和可扩展 使用COM+可从组件开发COM+应用程序,以提供基础服务和代码,而不是从头进行开发。 当开发基于DNA的多层应用程序时,这些服务给我们提供了起点。这些应用程序能发挥 COM+所提供的服务与基础结构的优势,这些都是企业级应用程序所需要的,如事务处理 组件管理、安全和对象缓冲等。每一项服务对于完成任务都是举足轻重的,如果自己开发需 要投入很大的精力。还好现在都由 Windows2000提供。我们所要做的只是使用 Component Services Explorer来定义如何使用而已 组件服务是微软对COM、COM+以及像微软消息队列( Microsoft Message Queue,MSMQ) 这样的相关技术的概括性名称。 本章内容包括 COM+如何为开发稳固且可扩展的基于组件的应用程序提供构件 如何创建和管理应用程序。 如何用 Visual basic创建用于COM+环境的组件 线程和组件作用域如何影响网站的可扩展性。 如何调试COM+组件。 下面先从COM+概述开始,了解COM+作为 Windows2000完整的一个组成部分,对于基 组件的应用程序开发人员多么有用,并进一步研究COM+构造的基本原理。 15.1微软组件服务(COM+) 第13章介绍了微软组件服务( Microsoft Component Services,MCS)和COM+作为配置 Windows dna的工具,研究了COM+作为一个“对象管理者”的功能。作为一个对象管理者 COM+在整个生存期负责管理COM+对象,这就意味着COM+实际上创建了对象,管理应用程 序对组件的使用,然后当其不再使用时就取消这些对象 使用像COM+这样的“对象管理员”来管理对象的生存期,而不是让每个应用程序去单 独管理,通过仔细监视和操纵应用程序和COM+对象之间的基本交互,能够更加有效地使用 系统资源,为了完成这个目的,COM+需要以某种方式与应用程序/对象相关联
下载 第15章 COM+应用程序 当我们伴随着Windows 2000和ASP 3.0进入2 1世纪时,发现微软在企业应用程序开发方面 扩展和改进了对开发人员来说非常有用的工具和技术。在前面两章中讨论了如何使用 A S P和 C O M构建We b应用程序。通过使用功能强大的 I I S,使用所选择的程序语言开发 C O M组件,使 We b应用程序远远超越仅使用 A S P脚本创建互相链接的简单网页的水平。可以开发安全高效的 基于组件的可扩展应用程序,以此来支持面向数以千计用户的业务处理。 Windows 2000中显著的变化是微软的事务服务器 (Microsoft Transaction Server,M T S )得 以改善并融入C O M运行期中,当然,除此以外还有许多其他新的特性和改进。每一项改进都 可以使我们的应用程序比以前更为强大和可扩展。 使用C O M +可从组件开发C O M +应用程序,以提供基础服务和代码,而不是从头进行开发。 当开发基于 D N A的多层应用程序时,这些服务给我们提供了起点。这些应用程序能发挥 C O M +所提供的服务与基础结构的优势,这些都是企业级应用程序所需要的,如事务处理、 组件管理、安全和对象缓冲等。每一项服务对于完成任务都是举足轻重的,如果自己开发需 要投入很大的精力。还好现在都由 Windows 2000提供。我们所要做的只是使用 C o m p o n e n t Services Explorer来定义如何使用而已。 组件服务是微软对C O M、C O M +以及像微软消息队列(Microsoft Message Queue,M S M Q ) 这样的相关技术的概括性名称。 本章内容包括: • COM+如何为开发稳固且可扩展的基于组件的应用程序提供构件。 • 如何创建和管理应用程序。 • 如何用Visual Basic创建用于C O M +环境的组件。 • 线程和组件作用域如何影响网站的可扩展性。 • 如何调试C O M +组件。 下面先从C O M +概述开始,了解 C O M +作为Windows 2000完整的一个组成部分,对于基 于组件的应用程序开发人员多么有用,并进一步研究 C O M +构造的基本原理。 15.1 微软组件服务( C O M + ) 第1 3章介绍了微软组件服务 (Microsoft Component Services,M C S )和C O M +作为配置 Windows DNA的工具,研究了C O M +作为一个“对象管理者”的功能。作为一个对象管理者, C O M +在整个生存期负责管理C O M +对象,这就意味着C O M +实际上创建了对象,管理应用程 序对组件的使用,然后当其不再使用时就取消这些对象。 使用像C O M +这样的“对象管理员”来管理对象的生存期,而不是让每个应用程序去单 独管理,通过仔细监视和操纵应用程序和 C O M +对象之间的基本交互,能够更加有效地使用 系统资源,为了完成这个目的, C O M +需要以某种方式与应用程序 /对象相关联
第15章(COM+用程序459 下载 15.1.1拦截原理 COM+能够在应用程序和COM对象(组件)之间插入代码。在本章你将看到,这种拦截 ( Interception)是如何通过COM实现的,但现在把这个过程想象为一种COM+“粘性”代码, 只要COM对象的方法或属性在应用程序中使用,就调用这段代码,完成一些初始的设置过程, 然后调用真正的对象方法 为了理解拦截所能提供的益处和功能,先考虑一个典型的Web应用程序:有多个用户每 天以较高的频率访问同一个ASP页面,基于组件的Web应用程序中每个ASP页将包含完成下面 个基本步骤的ASP脚本 创建一个或多个COM对象 使用COM对象生成页面。 取消这些COM对象 假如一天之内收到50000个关于该页面的请求,如果该页面创建两个COM对象,那就需 要创建和取消1000个COM对象。考虑到创建和取消COM对象需要的计算机资源的总开销, 相比之下循环使用COM对象效率更高。当ASP完成调用COM对象以后,将其放入一个缓冲池 内,并可从缓冲池中取出,由其他的ASP页面重复使用。我们将看到这会明显提高Web站点的 性能。如果所使用的对象在每次创建使用之前(例如连接一个数据库或载入值),进行合理的初 始化工作,可使web站点的潜在性能进一步提高。使用缓冲,可以仅进行一次初始化工作 依据这种循环的思想,理想的ASP页面中的理想的ASP脚本应该依据下面的基本步骤: ·在建立COM对象前,查看缓冲池内是否存在该对象可供重复使用,如果没有,则创建 个新的对象 ·使用COM对象来生成一个页面。 将COM对象返回缓冲池,以供其他页面使用 这个循环过程听起来是很理想。当然实际上,这不可能在ASP脚本中实现。最简单的原 因是不能直接访问COM运行期( runtime),正如在第14章中讨论过的,活动脚本( Active Scripting)引擎调用运行期。即使能使用COM运行期,ASP脚本本身的限制和活动脚本引擎实 际上也阻止这种缓冲方式。暂且把这些限制放在一边,假如能够完成这种缓冲,可以想象 在实现时下面的这些复杂问题是不得不考虑的: 谁来管理对象的缓冲池? 缓冲池何时创建和取消 ·对象在缓冲池中何时创造和取消? 在什么阶段取消对象? 如何管理多个用户同时访问缓冲池? ASP脚本与缓冲池如何交互?程序员编写脚本时,能够记住在创建一个新对象之前必须 检查缓冲池,用完对象之后将一个COM对象返回到缓冲池吗? 显然在ASP脚本中实现这种功能是不可能的,即使能实现这种功能,在实现过程中,也 存在着两个非常重要的障碍需要解决 ·必须自己实现对象缓冲池的代码,要充分考虑到代码、测试、调试和维护周期 使用缓冲池的ASP页面代码必须要正确使用对象缓冲池,而让程序员考虑得太多是一种 错误的倾向。程序员可能经常忘记使用缓冲池
15.1.1 拦截原理 C O M +能够在应用程序和 C O M对象(组件)之间插入代码。在本章你将看到,这种拦截 ( i n t e r c e p t i o n )是如何通过C O M +实现的,但现在把这个过程想象为一种 C O M +“粘性”代码, 只要C O M对象的方法或属性在应用程序中使用,就调用这段代码,完成一些初始的设置过程, 然后调用真正的对象方法。 为了理解拦截所能提供的益处和功能,先考虑一个典型的 We b应用程序:有多个用户每 天以较高的频率访问同一个 A S P页面,基于组件的We b应用程序中每个A S P页将包含完成下面 三个基本步骤的A S P脚本。 • 创建一个或多个C O M对象。 • 使用C O M对象生成页面。 • 取消这些C O M对象。 假如一天之内收到 5 0 0 0 0个关于该页面的请求,如果该页面创建两个 C O M对象,那就需 要创建和取消1 0 0 0 0 0个C O M对象。考虑到创建和取消 C O M对象需要的计算机资源的总开销, 相比之下循环使用 C O M对象效率更高。当A S P完成调用C O M对象以后,将其放入一个缓冲池 内,并可从缓冲池中取出,由其他的 A S P页面重复使用。我们将看到这会明显提高 We b站点的 性能。如果所使用的对象在每次创建使用之前 (例如连接一个数据库或载入值 ),进行合理的初 始化工作,可使 We b站点的潜在性能进一步提高。使用缓冲,可以仅进行一次初始化工作。 依据这种循环的思想,理想的 A S P页面中的理想的A S P脚本应该依据下面的基本步骤: • 在建立C O M对象前,查看缓冲池内是否存在该对象可供重复使用,如果没有,则创建 一个新的对象。 • 使用C O M对象来生成一个页面。 • 将C O M对象返回缓冲池,以供其他页面使用。 这个循环过程听起来是很理想。当然实际上,这不可能在 A S P脚本中实现。最简单的原 因是不能直接访问 C O M运行期 ( r u n t i m e ),正如在第 1 4章中讨论过的,活动脚本 ( A c t i v e S c r i p t i n g )引擎调用运行期。即使能使用 C O M运行期,A S P脚本本身的限制和活动脚本引擎实 际上也阻止这种缓冲方式。暂且把这些限制放在一边,假如能够完成这种缓冲,可以想象, 在实现时下面的这些复杂问题是不得不考虑的: • 谁来管理对象的缓冲池? • 缓冲池何时创建和取消? • 对象在缓冲池中何时创造和取消? • 在什么阶段取消对象? • 如何管理多个用户同时访问缓冲池? • A S P脚本与缓冲池如何交互?程序员编写脚本时,能够记住在创建一个新对象之前必须 检查缓冲池,用完对象之后将一个 C O M对象返回到缓冲池吗? 显然在A S P脚本中实现这种功能是不可能的,即使能实现这种功能,在实现过程中,也 存在着两个非常重要的障碍需要解决: • 必须自己实现对象缓冲池的代码,要充分考虑到代码、测试、调试和维护周期。 • 使用缓冲池的A S P页面代码必须要正确使用对象缓冲池,而让程序员考虑得太多是一种 错误的倾向。程序员可能经常忘记使用缓冲池。 第1 5章 C O M +应用程序计计459 下载
460A5p3高程 Chinaopub.com 下载 COM+减轻了这些负担,提供了一个一般性的基础结构来支持许多不同类型的预写服务, 使组件可透明使用。不用更改一条代码就可使用它们中的一部分 1.COM+的补救措施 COM+是通过下面的机制来弥补这两点的不足 (1)COM+提供服务 首先,COM+提供一系列的服务,例如对象缓冲池,可在COM+应用程序中使用,不用编 写任何代码就可实现这些服务,这意味着不需要调试和检测,也不用担心前面讨论的任何其 他问题。简单地配置组件,通过 Component Services Explorer就可使用请求的服务。我们把那 些使用COM+服务的组件称为“配置的组件”,通过 Component Services Explorer构建的COM+ 应用程序就是使用这种类型的组件。 (2)COM+提供了组件服务之间的透明交互 第二,COM+提供一个基础结构,这意味可以在不改变任何代码的情况下自动地利用这 些服务的优点,因此ASP脚本和其他语言(如VB),能够屏蔽COM+运行期,可以在代码没有 重大改变的情况下使用这些服务。ASP脚本或组件使用这些服务不需要重新编译或修改,在 COM+运行期中也不需要调用低层次的C/C++API函数。不像COM,大多数COM+都是通过 COM接口使用的。 些COM+服务对编程增加了一些规则,需要稍稍修改代码,才能使组件充分使用它们。 正如讨论过的,一些服务(如对象缓冲池)当前在一些编程语言中是不可用的,这主要是由于这 些语言与COM+服务的额外要求之间存在着内在的不兼容性问题,然而,目前微软正在改进 这些服务使之能够用于其他的语言。 本章讨论的是COM+1.0。COM+20许诺增加更多的服务。 2.对象缓冲池 COM会管理所有的代码,根据请求实现一个服务(如缓冲池)。这意味着代码仅需如通常 一样创建和释放一个COM对象;在后台,COM+将使用拦截来实现缓冲池。COM+确保在创 建一个新的对象之前检测缓冲池,试图使用缓冲池中存在的对象:不再使用时,把对象放到 缓冲池中,实现缓冲池的代码不必插入应用程序中,因为在组件中插入服务是透明完成的 VB没有缓冲池 COM+提供了一个强大的通用框架,可提高Web应用程序性能,而不必改变任何代码。通 过 Component Services Explorer来选择组件所使用的服务,不需要重新编译这些组件。若管理 员要增加组件安全性,只让特定的用户能够调用特定的方法,仅需使用组件服务,不需改变 代码。不必担心所有可能使用此组件的应用程序的安全要求。我们把话题转回到COM+。 在幕后,COM+运行期确保已经为组件配置好的服务通过拦截被加入及使用。 我们已经指出在COM+中“拦截”这个词是非常重要的。 不好的方面是,不是所有的服务能被那些用VB编写的组件所使用。大部分能,但缓冲池 是一种不能使用的服务。原因将在后面讲述,但假如想使用特殊的服务,必须用C++编写自 己的组件(在17章中讨论)。已经有大量的服务可供选择,如事务支持和安全性。但为了充分利 用这些服务,应该理解我们所讨论的相关内容,如无状态组件。我们将在第19章中研究 COM+在事务管理中充当的角色
C O M +减轻了这些负担,提供了一个一般性的基础结构来支持许多不同类型的预写服务, 使组件可透明使用。不用更改一条代码就可使用它们中的一部分。 1. COM+的补救措施 C O M +是通过下面的机制来弥补这两点的不足。 (1) COM+提供服务 首先,C O M +提供一系列的服务,例如对象缓冲池,可在 C O M +应用程序中使用,不用编 写任何代码就可实现这些服务,这意味着不需要调试和检测,也不用担心前面讨论的任何其 他问题。简单地配置组件,通过 Component Services Explorer就可使用请求的服务。我们把那 些使用C O M +服务的组件称为“配置的组件”,通过Component Services Explorer构建的C O M + 应用程序就是使用这种类型的组件。 (2) COM+提供了组件/服务之间的透明交互 第二,C O M +提供一个基础结构,这意味可以在不改变任何代码的情况下自动地利用这 些服务的优点,因此 A S P脚本和其他语言 (如V B ),能够屏蔽C O M +运行期,可以在代码没有 重大改变的情况下使用这些服务。 A S P脚本或组件使用这些服务不需要重新编译或修改,在 C O M +运行期中也不需要调用低层次的 C/C++ API函数。不像C O M,大多数C O M +都是通过 C O M接口使用的。 一些C O M +服务对编程增加了一些规则,需要稍稍修改代码,才能使组件充分使用它们。 正如讨论过的,一些服务 (如对象缓冲池)当前在一些编程语言中是不可用的,这主要是由于这 些语言与C O M +服务的额外要求之间存在着内在的不兼容性问题,然而,目前微软正在改进 这些服务使之能够用于其他的语言。 本章讨论的是COM+ 1.0。COM+ 2.0许诺增加更多的服务。 2. 对象缓冲池 C O M +会管理所有的代码,根据请求实现一个服务 (如缓冲池)。这意味着代码仅需如通常 一样创建和释放一个 C O M对象;在后台, C O M +将使用拦截来实现缓冲池。 C O M +确保在创 建一个新的对象之前检测缓冲池,试图使用缓冲池中存在的对象;不再使用时,把对象放到 缓冲池中,实现缓冲池的代码不必插入应用程序中,因为在组件中插入服务是透明完成的。 V B没有缓冲池 C O M +提供了一个强大的通用框架,可提高 We b应用程序性能,而不必改变任何代码。通 过Component Services Explorer来选择组件所使用的服务,不需要重新编译这些组件。若管理 员要增加组件安全性,只让特定的用户能够调用特定的方法,仅需使用组件服务,不需改变 代码。不必担心所有可能使用此组件的应用程序的安全要求。我们把话题转回到 C O M +。 在幕后,C O M +运行期确保已经为组件配置好的服务通过拦截被加入及使用。 我们已经指出在C O M +中“拦截”这个词是非常重要的。 不好的方面是,不是所有的服务能被那些用 V B编写的组件所使用。大部分能,但缓冲池 是一种不能使用的服务。原因将在后面讲述,但假如想使用特殊的服务,必须用 C + +编写自 己的组件(在1 7章中讨论)。已经有大量的服务可供选择,如事务支持和安全性。但为了充分利 用这些服务,应该理解我们所讨论的相关内容,如无状态组件。我们将在第 1 9章中研究 C O M +在事务管理中充当的角色。 460计计ASP 3 高级编程 下载
第5章(OM+用程序461 下载 因此,让我们先研究COM+是怎样工作的 151.2cOM+结构 第14章讨论了COM的两个组成部分,组件和接口。我们认为组件是个黑盒子,通过一个 或更多的接口为客户提供功能,客户不必了解组件功能是如何 编写的,但它们在使用组件所提供的功能时,需要知道所依赖 的接口是一种协议。在两者之间最基本的交互如图15-1所示 客户使用组件的接口来完成一些任务 图15-1用户与组件的关系 图15-1中没有显示任何接口名,这是一个适用于任何客户/对象对的通用框图。 1.拦截 COM+为了能将服务透明地加到一个对象上,将自己放入客户与组件实例之间,例如为 了实现缓冲池,COM+服务必须拦截对 IUnknown的 Release方法的调用。如在14章中讨论的, 每一个COM对象保存一个引用计数,以便每个对象能够跟踪有多少个客户正在使用它。当引 用计数为零时,对象负责取消自己。很明显当我们想让别的客户重复使用此对象时,由对象 本身完成这个工作是不合适的,因此COM+需要管理这个基本的生存期循环。在理论上,需 要的改变是比较简单的 ·当对象创建时,COM+对象的缓冲池服务额外增加对组件的引用计数,表示进行缓冲。 监视对被缓冲对象的 Release方法的调用,当检测到对象只有一个外部引用时,可将它放 回缓冲池中,因为其他用户不再使用该对象,因此它属于这个引用。 际上,对一个特定的组件来说实现这些 变换是比较复杂的,但COM+使之简单化。为 成拦截请求来实现服务,COM+使用了轻量 代理( (lightweight proxy),如图15-2所示 图15-2用户、代理和组件的关系 之所以称之为轻量代理(也称为拦截器),是因为其包含了正好足够的代码,确保粘性代码 能够放在客户与真实对象之间,确保所有配置的组件需要使用的服务在运行期内正常使用 当客户调用一种方法时,粘性代码确保方法在实际执行时,运行期环境是在合适的状 态:当方法完成后,恢复原来环境。例如,考虑下面这种情况,一个对象客户在一个事务里 但是所调用的组件的配置是请求一个新事务。拦截的粘性代码将确保把当前的事务放在一边 创建一个新的事务,然后调用方法。在调用的方法中完成的工作与新的事务相联系,而不是 与实际调用组件的客户的事务相联系。当方法返回时,将恢复原有的事务,新创建的事务结 这就是拦截工作方式的最简单描述。可以想象一下,COM+运行期代表组件执行一个或 多个前后的设置步骤,就会明白COM+运行期正在做些什么,以及为什么轻量代理是如此重 要。它们完成那些难以编写的代码,这些代码完成了基本结构检测工作,使我们从编写这些 代码的工作中解脱出来 拦截听起来像一个多余的过程,因为客户调用对象的每一种方法都通过一个额外的间接 过程(粘性代码),但却能保证COM+运行期以一种非常有效的方式执行操作,如果客户与它创 建的对象使用相同的服务,经常会发现轻量代理不是必需的。因此也不会有额外的开销。 使使用的服务不同,增加的代码也是正好足以处理这些不同之处
因此,让我们先研究C O M +是怎样工作的。 15.1.2 COM+结构 第1 4章讨论了C O M的两个组成部分,组件和接口。我们认为组件是个黑盒子,通过一个 或更多的接口为客户提供功能,客户不必了解组件功能是如何 编写的,但它们在使用组件所提供的功能时,需要知道所依赖 的接口是一种协议。在两者之间最基本的交互如图 1 5 - 1所示。 客户使用组件的接口来完成一些任务。 图1 5 - 1中没有显示任何接口名,这是一个适用于任何客户 /对象对的通用框图。 1. 拦截 C O M +为了能将服务透明地加到一个对象上,将自己放入客户与组件实例之间,例如为 了实现缓冲池, C O M +服务必须拦截对 I U n k n o w n的R e l e a s e方法的调用。如在 1 4章中讨论的, 每一个C O M对象保存一个引用计数,以便每个对象能够跟踪有多少个客户正在使用它。当引 用计数为零时,对象负责取消自己。很明显当我们想让别的客户重复使用此对象时,由对象 本身完成这个工作是不合适的,因此 C O M +需要管理这个基本的生存期循环。在理论上,需 要的改变是比较简单的。 • 当对象创建时,C O M +对象的缓冲池服务额外增加对组件的引用计数,表示进行缓冲。 • 监视对被缓冲对象的R e l e a s e方法的调用,当检测到对象只有一个外部引用时,可将它放 回缓冲池中,因为其他用户不再使用该对象,因此它属于这个引用。 实际上,对一个特定的组件来说实现这些 变换是比较复杂的,但 C O M +使之简单化。为 完成拦截请求来实现服务, C O M +使用了轻量 代理(lightweight proxy),如图1 5 - 2所示。 之所以称之为轻量代理(也称为拦截器),是因为其包含了正好足够的代码,确保粘性代码 能够放在客户与真实对象之间,确保所有配置的组件需要使用的服务在运行期内正常使用。 当客户调用一种方法时,粘性代码确保方法在实际执行时,运行期环境是在合适的状 态;当方法完成后,恢复原来环境。例如,考虑下面这种情况,一个对象客户在一个事务里, 但是所调用的组件的配置是请求一个新事务。拦截的粘性代码将确保把当前的事务放在一边, 创建一个新的事务,然后调用方法。在调用的方法中完成的工作与新的事务相联系,而不是 与实际调用组件的客户的事务相联系。当方法返回时,将恢复原有的事务,新创建的事务结 束。 这就是拦截工作方式的最简单描述。可以想象一下, C O M +运行期代表组件执行一个或 多个前后的设置步骤,就会明白 C O M +运行期正在做些什么,以及为什么轻量代理是如此重 要。它们完成那些难以编写的代码,这些代码完成了基本结构检测工作,使我们从编写这些 代码的工作中解脱出来。 拦截听起来像一个多余的过程,因为客户调用对象的每一种方法都通过一个额外的间接 过程(粘性代码),但却能保证C O M +运行期以一种非常有效的方式执行操作,如果客户与它创 建的对象使用相同的服务,经常会发现轻量代理不是必需的。因此也不会有额外的开销。即 使使用的服务不同,增加的代码也是正好足以处理这些不同之处。 第1 5章 C O M +应用程序计计461 下载 客户 对象 图15-1 用户与组件的关系 图15-2 用户、代理和组件的关系 客户 代理 对象
462A5p3高装程 China pub. coM 下载 2.环境 COM+通过环境跟踪运行期的请求以及对象需要的服务 一个环境( context)是一系列运行期的属性,代表了一个或多个COM+对象的执 行请求。 例如,环境将告诉COM+,一个对象正在使用缓冲池或请求一个新的事务,这些请求是由声 明性属性( declarative attribute)来定义的,声明性属性是使用 Component Services Explorer设置给组 件的,存放在COM+类别中。这些设置直接影响包含在环境中的属性,并给COM+运行期提供正 确实现运行期对象(集)的服务的信息。稍后将你看到,能够在对象中访问这些属性中的一部分 每一个COM对象当其创建或从缓冲池取出时,都与单个的环境相关联。与对象关联的环 境一旦激活,将在对象的整个生存期中保持不变,直到对象返回到缓冲池或被取消。由 COM+使用的环境在对象生存期是有效的,使对象与边界外(out-of- bound)信息相关联。 术语“边界外”( out of band)意思是数据由COM+在幕后管理。 这些数据需要将服务应用于组件,没有环境则必须自己来保持这些信息 如果一些对象的运行期请求是“兼容”的,它们可共享同一个环境。这里使用了兼容 词,是因为在运行期共享一个环境的组件类型的配置不需要统一。COM+用于测试环境兼容 性的算法目前没有记录在文挡中。在一个对象内部,可以获得一个环境的引用,可使用 Getobject Context方法来得到与当前对象关联的环境。这将返回一个COM对象,称为 ObjectContext。在这个对象上通过函数返回的接口是 oBject Context Set objContext Getobjectcontext() (1)激活 对象进入可供客户使用的状态的过程我们称 对象 之为“激活”,创建对象的客户称为“激活者 ( activator),并且激活过程在ASP代码调用 Createobject时发生。在激活期间,环境与一个 对象相关联。 (2)对象与环境 图15-3对象、对象环境以及环境之间的关系 对象、对象环境以及环境之间的关系如图15-3所示,一旦对象激活,这个关系将保持不变 ObjectContext是一个COM对象,提供对运行期属性的访问。这些属性保存在与对象相关 联的环境中。 (3)环境协商 当一个COM+对象创建时,COM 类别用来确定组件所用的服务。假如现 有的环境匹配新创建的对象的环境,将 对象}→·对象环境←·对象 使用现有的环境,否则将创建一个新的 环境,如图15-4所示 如果组件请求的服务意味着激活者 的环境与所需要的不兼容,则一个不同 的环境(和 Object Context)将用于该对 图15-4对象环境匹配
2. 环境 C O M +通过环境跟踪运行期的请求以及对象需要的服务。 一个环境( c o n t e x t )是一系列运行期的属性,代表了一个或多个 C O M +对象的执 行请求。 例如,环境将告诉C O M +,一个对象正在使用缓冲池或请求一个新的事务,这些请求是由声 明性属性(declarative attribute)来定义的,声明性属性是使用Component Services Explorer设置给组 件的,存放在C O M +类别中。这些设置直接影响包含在环境中的属性,并给C O M +运行期提供正 确实现运行期对象(集)的服务的信息。稍后将你看到,能够在对象中访问这些属性中的一部分。 每一个C O M对象当其创建或从缓冲池取出时,都与单个的环境相关联。与对象关联的环 境一旦激活,将在对象的整个生存期中保持不变,直到对象返回到缓冲池或被取消。由 C O M +使用的环境在对象生存期是有效的,使对象与边界外 ( o u t - o f - b o u n d )信息相关联。 术语“边界外”(out of band)意思是数据由C O M +在幕后管理。 这些数据需要将服务应用于组件,没有环境则必须自己来保持这些信息。 如果一些对象的运行期请求是“兼容”的,它们可共享同一个环境。这里使用了兼容一 词,是因为在运行期共享一个环境的组件类型的配置不需要统一。 C O M +用于测试环境兼容 性的算法目前没有记录在文挡中。在一个对象内部,可以获得一个环境的引用,可使用 G e t O b j e c t C o n t e x t方法来得到与当前对象关联的环境。这将返回一个 C O M对象,称为 O b j e c t C o n t e x t。在这个对象上通过函数返回的接口是 I O b j e c t C o n t e x t。 (1) 激活 对象进入可供客户使用的状态的过程我们称 之为“激活”,创建对象的客户称为“激活者” ( a c t i v a t o r ) ,并且激活过程在 A S P代码调用 C r e a t e O b j e c t时发生。在激活期间,环境与一个 对象相关联。 (2) 对象与环境 对象、对象环境以及环境之间的关系如图1 5 - 3所示,一旦对象激活,这个关系将保持不变。 O b j e c t C o n t e x t是一个C O M对象,提供对运行期属性的访问。这些属性保存在与对象相关 联的环境中。 (3) 环境协商 当一个C O M +对象创建时, C O M + 类别用来确定组件所用的服务。假如现 有的环境匹配新创建的对象的环境,将 使用现有的环境,否则将创建一个新的 环境,如图1 5 - 4所示。 如果组件请求的服务意味着激活者 的环境与所需要的不兼容,则一个不同 的环境 (和O b j e c t C o n t e x t )将用于该对 462计计ASP 3 高级编程 下载 图15-3 对象、对象环境以及环境之间的关系 环 境 对象 对象环境 图15-4 对象环境匹配 对象 对象环境 对象 环 境
第5章(COM+应用程序463 下载 象,如图15-5所示。 对象 对象环境 对象 对象环境 图15-5创建新的环境 返回到客户的代理确保激活者与对象之间的环境差异在运行期由COM+运行期透明管理。 因此在代码中不必操心这种管理工作 (4)IS和环境 IS使用环境向COM对象提供对ASP内置对象的访问,如图15-6所示, IIs (Inetinfo. exe) (对象)→·· 象环境 图15-6ASP对象与环境的关系 对ASP所有的内置对象,例如 Request和 Response的引用作为属性保存在环境中,该过程 由IS完成。任何与环境关联的COM对象可通过与环境相联系的 ObjectContext访问这些属性 记住, Object Context是一个COM对象,它提供从对象内部进入环境的接口。 这意味着一个COM对象能够访问IS(或任何其他使用环境暴露功能的应用程序)的功能, 即使在IS或对象之间没有“显式”的链接或联系。这就是说,这是一个IS通过使用COM+的 基础结构提供给组件的COM+服务 3.COM+幕后的成员(拦截、环境和COM+类别) 迄今为止,我们已讨论了关于COM+的一些关键内容 从配置的组件创建COM+应用程序 在配置的组件中使用COM+服务。 使用 Component Services Explorer配置COM应用程序和配置的组件 Component Services Explorer内的管理信息将存储在COM+类别中 COM+运行期使用环境和拦截来确保对象的运行期环境正确地使用为组件配置的服务。 所有这些对COM+来讲都是新内容的,不是 Windows2000前的COM的组成部分。假如你 曾经用过MTS,则下面两点需要注意 MTS包现在称为COM+应用程序 ·MTS提供的服务,如分布式事务和安全性,现在称为COM+服务
象,如图1 5 - 5所示。 图15-5 创建新的环境 返回到客户的代理确保激活者与对象之间的环境差异在运行期由 C O M +运行期透明管理。 因此在代码中不必操心这种管理工作。 (4) IIS和环境 I I S使用环境向C O M对象提供对A S P内置对象的访问,如图1 5 - 6所示。 图15-6 ASP对象与环境的关系 对A S P所有的内置对象,例如 R e q u e s t和R e s p o n s e的引用作为属性保存在环境中,该过程 由I I S完成。任何与环境关联的 C O M对象可通过与环境相联系的 O b j e c t C o n t e x t访问这些属性。 记住,O b j e c t C o n t e x t是一个C O M对象,它提供从对象内部进入环境的接口。 这意味着一个 C O M对象能够访问 I I S (或任何其他使用环境暴露功能的应用程序 )的功能, 即使在I I S或对象之间没有“显式”的链接或联系。这就是说,这是一个 I I S通过使用C O M +的 基础结构提供给组件的C O M +服务。 3. COM+幕后的成员(拦截、环境和C O M +类别) 迄今为止,我们已讨论了关于 C O M +的一些关键内容: • 从配置的组件创建C O M +应用程序。 • 在配置的组件中使用C O M +服务。 • 使用Component Services Explorer 配置C O M +应用程序和配置的组件。 • Component Services Explorer内的管理信息将存储在C O M +类别中。 • COM+运行期使用环境和拦截来确保对象的运行期环境正确地使用为组件配置的服务。 所有这些对C O M +来讲都是新内容的,不是 Windows 2000前的C O M的组成部分。假如你 曾经用过M T S,则下面两点需要注意: • MTS包现在称为C O M +应用程序。 • MTS提供的服务,如分布式事务和安全性,现在称为 C O M +服务。 第1 5章 C O M +应用程序计计463 下载 对象 对象 环 境 对象环境 对象环境 Request Response IIS (Inetinfo.exe) 对象 对象环境 环境A 环境B
464A5p3高程 Chinapul coM 下载 15.13组件/对象的生存期和状态 为了使用COM+提供的服务,需要重新考虑我们的编程风格。例如,COM+提供的一个服 务恰好及时的( Just-In-Time,Jn)激活,它延迟使用服务器资源直到真的需要使用这些资源时, 在客户不再使用对象的实例时确保释放它们 1.COM+的激活和释放 JIT激活指的是,直到调用第一个接口方法时,才激活对象的实例,这意味着一个对象的 初始化代码和资源请求将被延迟,直到真正需要它们。也就是说,直到绝对需要时,才消耗 服务器的资源,即消耗资源是客户调用对象方法的直接结果。这是很好的办法,因为这意味 着一个客户能在应用程序生存期的早期创建一个组件,在较晚时使用,而不需担心过早地消 耗资源。 基于相同的原则,COM+尽可能使不用的对象失效,尽可能早(AS-Soon-As- Possible, ASAP)失效使COM+能释放对象占用的内存和消耗的资源,同时允许客户确信仍然引用一个 真实的对象,而不必了解此对象是否已被取消。假如能缓冲对象,可使对象失效( deactive)而 不是取消( destroy)它。 但是一个客户怎样才能在应用程序生存期早期创建一个组件的实例,并仍然支持JT激活 和ASAP失效?答案是我们前面看到的拦截机制。当一个客户请求一个对象实例时,COM+拦 截这个代码(并且假设JT激活可用),它不创建对象实例,而是提供给客户一个虚拟的代理, 使客户相信引用的是一个真实的对象。 然后,当客户调用对象的方法时,代理拦截该调用并由COM+创建一个真实的对象实例 这个实例完成必要的处理过程。当方法调用完成后,对象失效,但是代理继续“欺骗”客户 如图15-7所示。 代理 图15-7客户调用对象时代理的拦截过程 正如我们已经解释过的,JT激活的含义是非常清楚的,ASP页面(或其他客户)首次调用 对象的方法时,激活对象。ASAP失效相对来说就不是很清楚了。当方法调用完毕后是否立即 使该对象失效?作为一个好的可扩展的COM+组件,答案是肯定的。这听起来会让人感到奇 怪,因为这样做,服务器必须重新创建对象,这会导致一定程度总开销的浪费。但是,需要 记住的是,任何应用需要考虑的一个重要因素是服务器宝贵的资源(例如内存等),快速使用, 快速释放以便其他客户能够使用这些资源。COM+保证能够做到这一点的唯一方法就是,使 对象失效,如果不进行缓冲就取消对象。 COM+能够根据需要有效地创建一个组件的实例,不断创建和释放对象的事实依赖于它 们的配置而不致造成过高的系统开销 (1)COM+应用程序中缓存类对象和DLL 为有效创建对象,COM+应用程序缓存COM服务器DLL和类对象 类对象是一种创建COM+对象的机制。类对象是一个COM对象,支持COM接口
15.1.3 组件/对象的生存期和状态 为了使用C O M +提供的服务,需要重新考虑我们的编程风格。例如, C O M +提供的一个服 务恰好及时的( J u s t - I n - Ti m e,J I T )激活,它延迟使用服务器资源直到真的需要使用这些资源时, 在客户不再使用对象的实例时确保释放它们。 1. COM+的激活和释放 J I T激活指的是,直到调用第一个接口方法时,才激活对象的实例,这意味着一个对象的 初始化代码和资源请求将被延迟,直到真正需要它们。也就是说,直到绝对需要时,才消耗 服务器的资源,即消耗资源是客户调用对象方法的直接结果。这是很好的办法,因为这意味 着一个客户能在应用程序生存期的早期创建一个组件,在较晚时使用,而不需担心过早地消 耗资源。 基于相同的原则, C O M +尽可能使不用的对象失效,尽可能早 ( A S - S o o n - A s - P o s s i b l e, A S A P )失效使C O M +能释放对象占用的内存和消耗的资源,同时允许客户确信仍然引用一个 真实的对象,而不必了解此对象是否已被取消。假如能缓冲对象,可使对象失效 ( d e a c t i v e )而 不是取消( d e s t r o y )它。 但是一个客户怎样才能在应用程序生存期早期创建一个组件的实例,并仍然支持 J I T激活 和A S A P失效?答案是我们前面看到的拦截机制。当一个客户请求一个对象实例时, C O M +拦 截这个代码 (并且假设J I T激活可用 ),它不创建对象实例,而是提供给客户一个虚拟的代理, 使客户相信引用的是一个真实的对象。 然后,当客户调用对象的方法时,代理拦截该调用并由 C O M +创建一个真实的对象实例, 这个实例完成必要的处理过程。当方法调用完成后,对象失效,但是代理继续“欺骗”客户。 如图1 5 - 7所示。 图15-7 客户调用对象时代理的拦截过程 正如我们已经解释过的, J I T激活的含义是非常清楚的, A S P页面(或其他客户 )首次调用 对象的方法时,激活对象。 A S A P失效相对来说就不是很清楚了。当方法调用完毕后是否立即 使该对象失效?作为一个好的可扩展的 C O M +组件,答案是肯定的。这听起来会让人感到奇 怪,因为这样做,服务器必须重新创建对象,这会导致一定程度总开销的浪费。但是,需要 记住的是,任何应用需要考虑的一个重要因素是服务器宝贵的资源 (例如内存等),快速使用, 快速释放以便其他客户能够使用这些资源。 C O M +保证能够做到这一点的唯一方法就是,使 对象失效,如果不进行缓冲就取消对象。 C O M +能够根据需要有效地创建一个组件的实例,不断创建和释放对象的事实依赖于它 们的配置而不致造成过高的系统开销。 (1) COM+应用程序中缓存类对象和D L L 为有效创建对象,C O M +应用程序缓存C O M服务器D L L和类对象。 类对象是一种创建 C O M +对象的机制。类对象是一个 C O M对象,支持C O M接口 464计计ASP 3 高级编程 下载 客户 代理 真实对象
第15章(OM+应用程序465 下载 IClassFactory。该接口有一个方法 Createlnstance,创建并返回一个COM+对象。每种 类型的COM+组件有一个类对象。VB会自动创建这些类对象。 当客户创建一个包含在COM+应用程序中的组件实例时,将会发生 如果内存中没有的话,包含组件的DLL将被调入 创建组件类型的类对象 ·COM+请求类对象创建新的COM+对象实例 当COM+应用程序载入一个COM服务器(DLL)去创建某类型的COM+对象时,在COM+应 用程序关闭前,DLL一直保存在内存中。假國w性 如COM+不能完成缓存工作,当最后一个由 a securily Identy Activation Queuing Advarced 来自于该DLL的类对象创建的对象取消时 Leave running when d 卸载该DLL。一个对象的重复创建和取消会 引起一个DLL重复载入和卸载,可能会引起 硬盘不停地运转。COM+允许定义空闲时间 段,经过这个空闲段后COM+应用程序和所 Lbie deletion 有载入的DLL才释放(见图15-8) 当COM+应用程序创建一个类对象时 Launch n debugger 将保持对类对象的一个引用直到其卸载。这 意味着第一次创建对象以后仅需要执行下面 个步骤: 厂Enae3 GB supoort COM+请求类对象创建一个新的COM+ 对象的实例 这种缓存能够改进对象创建的性能,这 图15-8设定空闲时间段 也意味着对于创建非缓冲对象,JT激活的开 销不致于过高 (2)JT激活不需要改变COM 需要清楚的是COM的基本规则没有为了对服务的支持而改变,如果没有外部引用,将取 消COM+对象的实例。然而,这会改变客户编程方式,使我们的组件成为无状态组件。 无状态”编程范型 个COM+组件,像任何COM组件一样,能够在客户交互(方法调用)之间在内部存储信 息。这一工作我们称之为保持状态,称这种组件为状态化组件。现在,假如我们标识该组件 使用JIT激活,并为使对象失效增加必要的调用,这个模型将发生较大的改变 由对象存储和管理的信息,当客户调用时,对于后续的方法调用将不再可用。通过使组 件使用JIT激活,告诉COM+在方法调用之间可使对象失效,这其中的含义就是下一个方法调 用将可能潜在地由不同的对象实例处理。 这里使用了“潜在地”一词,是因为如果对象被缓冲,那么使对象失效并放回 缓冲池,则从缓冲池中取出供下一个调用使用的对象,可能会与原来的不相同 3.对于JT组件忘掉面向对象编程 这个问题需要一些时间来理解,读者可能读过相关的许多文章,都在一定程度不正确地
I C l a s s F a c t o r y。该接口有一个方法C r e a t e I n s t a n c e,创建并返回一个C O M +对象。每种 类型的C O M +组件有一个类对象。V B会自动创建这些类对象。 当客户创建一个包含在C O M +应用程序中的组件实例时,将会发生: • 如果内存中没有的话,包含组件的 D L L将被调入。 • 创建组件类型的类对象。 • COM+请求类对象创建新的C O M +对象实例。 当C O M +应用程序载入一个C O M服务器( D L L )去创建某类型的C O M +对象时,在C O M +应 用程序关闭前, D L L一直保存在内存中。假 如C O M +不能完成缓存工作,当最后一个由 来自于该 D L L的类对象创建的对象取消时, 卸载该D L L。一个对象的重复创建和取消会 引起一个D L L重复载入和卸载,可能会引起 硬盘不停地运转。 C O M +允许定义空闲时间 段,经过这个空闲段后 C O M +应用程序和所 有载入的D L L才释放(见图1 5 - 8 )。 当C O M +应用程序创建一个类对象时, 将保持对类对象的一个引用直到其卸载。这 意味着第一次创建对象以后仅需要执行下面 一个步骤: • C O M +请求类对象创建一个新的 C O M + 对象的实例。 这种缓存能够改进对象创建的性能,这 也意味着对于创建非缓冲对象, J I T激活的开 销不致于过高。 (2) JIT激活不需要改变C O M 需要清楚的是C O M的基本规则没有为了对服务的支持而改变,如果没有外部引用,将取 消C O M +对象的实例。然而,这会改变客户编程方式,使我们的组件成为无状态组件。 2 .“无状态”编程范型 一个C O M +组件,像任何 C O M组件一样,能够在客户交互 (方法调用)之间在内部存储信 息。这一工作我们称之为保持状态,称这种组件为状态化组件。现在,假如我们标识该组件 为使用J I T激活,并为使对象失效增加必要的调用,这个模型将发生较大的改变。 由对象存储和管理的信息,当客户调用时,对于后续的方法调用将不再可用。通过使组 件使用J I T激活,告诉C O M +在方法调用之间可使对象失效,这其中的含义就是下一个方法调 用将可能潜在地由不同的对象实例处理。 这里使用了“潜在地”一词,是因为如果对象被缓冲,那么使对象失效并放回 缓冲池,则从缓冲池中取出供下一个调用使用的对象,可能会与原来的不相同。 3. 对于J I T组件忘掉面向对象编程 这个问题需要一些时间来理解,读者可能读过相关的许多文章,都在一定程度不正确地 第1 5章 C O M +应用程序计计465 下载 图15-8 设定空闲时间段
466Asp;海编程 Chinapub coM 下载 定义无状态( stateless)编程模型这个概念,简单而言,无状态编程模型对于开发人员有两方面 含义 个客户不能依靠同一个对象实例处理每一个方法的调用(对于同一个对象)。因为无法 确定方法调用之间的一个对象的状态。 一个对象不能依赖于同一个客户调用其提供的每一个方法,如果对象被缓冲,许多客户 将重复使用同一对象 这两点实际上十分简单,但对创建组件和客户的方式有很大影响,面向对象编程(OOP)对 JⅠT组件来说,不能正常工作。面向对象技术的基础是对象有同一性、行为以及一段时间的状 态。恰好是最后一点不满足要求,因此如下代码不能正常工作: Dim objPerson As Richard Set objPerson New Richard bjPerson, Name ="Richard bjPerson DOB 1972 objPerson. Title ="Developer objPerson. UpdateDetails 这是一个非常典型的OOP,我们先设置对象的属性,然后要求对象通过一些存储媒介保 存变化情况。你能看出问题吗?是的,每次属性的存取和方法的调用将引起COM+的运行期 创建或取消COM对象,从代码中看不出这个过程,因为创建和取消发生在COM+运行期内, 在我们调用 Update Details方法时使用的对象实例,可能不是设置属性时使用的那个。对象存 储什么内容呢?存储的可能是在组件 Class Initialize例程中初始化的缺省值。 作为传统的OOP不会使用COM+JT配置的组件。我们必须回过头来考虑其他的使用组件 和客户的方式。不使用JIT的组件可使用OOP技术进行编程,但对于JIT组件必须把代码改变 为“面向过程”。简单说,这意味着客户要把处理一个请求所需的所有状态传给对象(在每次 方法调用中) (1)面向过程的对象 对于上面的代码,我们重写为 Dim ob]Person As Richard Set objPerson New Richard bi Person. UpdateDetails Richard,, 1972, Developer 我们现已知道依赖于方法调用间的状态不是一个可行办法,所以将所有需要的状态作为 参数传给完成 Update Details的过程 在ASP中,对于无状态组件有两个地方需要注意: ·避免存储任何信息在组件的局部变量中 避免页面-页面之间保持组件的引用 最简单的避免客户将信息存储在对象内的方法是,只提供组件的基于方法的接口,组件 应没有公共属性,所有与组件的交互都通过方法调用完成,所有的组件所需的工作信息,均 作为参数传递给方法调用 (2)对象状态可重复使用
定义无状态( s t a t e l e s s )编程模型这个概念,简单而言,无状态编程模型对于开发人员有两方面 含义: • 一个客户不能依靠同一个对象实例处理每一个方法的调用 (对于同一个对象 )。因为无法 确定方法调用之间的一个对象的状态。 • 一个对象不能依赖于同一个客户调用其提供的每一个方法,如果对象被缓冲,许多客户 将重复使用同一对象。 这两点实际上十分简单,但对创建组件和客户的方式有很大影响,面向对象编程 ( O O P )对 J I T组件来说,不能正常工作。面向对象技术的基础是对象有同一性、行为以及一段时间的状 态。恰好是最后一点不满足要求,因此如下代码不能正常工作: 这是一个非常典型的 O O P,我们先设置对象的属性,然后要求对象通过一些存储媒介保 存变化情况。你能看出问题吗?是的,每次属性的存取和方法的调用将引起 C O M +的运行期 创建或取消 C O M对象,从代码中看不出这个过程,因为创建和取消发生在 C O M +运行期内, 在我们调用U p d a t e D e t a i l s方法时使用的对象实例,可能不是设置属性时使用的那个。对象存 储什么内容呢?存储的可能是在组件 C l a s s _ I n i t i a l i z e例程中初始化的缺省值。 作为传统的O O P不会使用COM+ JIT配置的组件。我们必须回过头来考虑其他的使用组件 和客户的方式。不使用 J I T的组件可使用 O O P技术进行编程,但对于 J I T组件必须把代码改变 为“面向过程”。简单说,这意味着客户要把处理一个请求所需的所有状态传给对象 (在每次 方法调用中)。 (1) 面向过程的对象 对于上面的代码,我们重写为: 我们现已知道依赖于方法调用间的状态不是一个可行办法,所以将所有需要的状态作为 参数传给完成U p d a t e D e t a i l s的过程。 在A S P中,对于无状态组件有两个地方需要注意: • 避免存储任何信息在组件的局部变量中。 • 避免页面-页面之间保持组件的引用 最简单的避免客户将信息存储在对象内的方法是,只提供组件的基于方法的接口,组件 应没有公共属性,所有与组件的交互都通过方法调用完成,所有的组件所需的工作信息,均 作为参数传递给方法调用。 (2) 对象状态可重复使用 466计计ASP 3 高级编程 下载
第5章(COM+应用程序467 下载 我们知道包含相关信息的对象状态是由对象保存的,通常大多数对象保存的状态与某 特定客户有关。例如,在一个电子商务的应用程序中,如果用一个COM对象表示某一特定用 户采购的内容,那么该对象将唯一地对应这个用户,该对象的状态对于他人毫无用处,所以 不能重复利用。 为什么要重复利用对象的状态?假设一个简单的对象可使一系列值有效,一些应用程序 创建并使用此组件的实例。现在,假设每一实例从数据库中装入这些值,创建这些实例将花 费很长的时间,如果有许多人用某一组件,将需要大量的数据库输入输出,给应用程序带来 的开销很大 通过缓冲这样一个组件,可以重复利用由组件实例创建的值列表,而无需每次重复装入 因为对象保存的状态并不特定对应于某指定的客户,如上述的采购示例,所以可以实现上述 方法。因此,若VB支持对象缓冲,需要记住的是状态可以重复使用。JT是一个可加快对象 初始化的好方法。一个具有代表性的例子就是 OLE DB,它能够缓冲数据库的连接,建立数据 库的连接需要长时间,由于一般的启动过程和身份验证相当慢。所以,通过缓冲这些连接 连接开销大这一问题仅在第一次启动对象时出现,而后的用户可重复利用,当然这里假设安 全和连接字符串是兼容的 3)在可扩展系统中保持对象的时间应最小化 前面提到的购物示例中,我们有一个代表购物的对象,但其可扩展性太差。要理解其原 因,假设系统工作于一个大型的网站如 amazon. com,支持成千上万个同时访问的用户,每 用户有一相应的COM对象表示他们的采购行为,存储在 Session对象中。现在,假如我们知道 组件需要10KB内存来执行和维持采购行为,估计在高峰时有5000个活动的 Session,需要5000 ×10KB(大约50000KB或49MB来维持这一个组件。即使内存比较便宜,对于这个问题也要引 起足够的重视。 选择用于创建组件的工具,有助于我们实现其他一些无状态组件的关键设计。通过 Visual Basic创造的组件的类型应该仅仅存在于一个应用程序的页面范围之内,通过VB创造的组件不 应存储在 Session中或者应用程序级的变量中,任何这样做的企图将导致web服务器性能严重 地下降,可以配置ASP从而产生一个错误信息,防止这种情况的发生。通过这种方式,在创 建一个Web的应用程序时,ASP自身促进无状态组件的使用。这取决于VB组件可以支持的线 程模型。 152单元和线程模型 作为 VB ASP的开发人员,不需担心单元和线程模型,但应该意识到它们是COM+的基本 组成部分。理解它们之前首先需要理解线程 152.1线程 简单地说,可把线程看作“轻量进程”,不像通常的进程,线程并不是实际的系统资源, 在 Windows下启动一个运用程序,如 Notepad,操作系统将创建应用程序在其中执行的一个进 程,这个进程将有其自己的地址空间,因而独立于其他进程,这样即使这个应用程序出现严 重错误,将保持其他应用程序的完整性。 在一个进程中总是至少有一个线程,称为主线程。一个线程是操作分配CPU时间最基本
我们知道包含相关信息的对象状态是由对象保存的,通常大多数对象保存的状态与某一 特定客户有关。例如,在一个电子商务的应用程序中,如果用一个 C O M对象表示某一特定用 户采购的内容,那么该对象将唯一地对应这个用户,该对象的状态对于他人毫无用处,所以 不能重复利用。 为什么要重复利用对象的状态?假设一个简单的对象可使一系列值有效,一些应用程序 创建并使用此组件的实例。现在,假设每一实例从数据库中装入这些值,创建这些实例将花 费很长的时间,如果有许多人用某一组件,将需要大量的数据库输入输出,给应用程序带来 的开销很大。 通过缓冲这样一个组件,可以重复利用由组件实例创建的值列表,而无需每次重复装入。 因为对象保存的状态并不特定对应于某指定的客户,如上述的采购示例,所以可以实现上述 方法。因此,若 V B支持对象缓冲,需要记住的是状态可以重复使用。 J I T是一个可加快对象 初始化的好方法。一个具有代表性的例子就是 OLE DB,它能够缓冲数据库的连接,建立数据 库的连接需要长时间,由于一般的启动过程和身份验证相当慢。所以,通过缓冲这些连接, 连接开销大这一问题仅在第一次启动对象时出现,而后的用户可重复利用,当然这里假设安 全和连接字符串是兼容的。 (3) 在可扩展系统中保持对象的时间应最小化 前面提到的购物示例中,我们有一个代表购物的对象,但其可扩展性太差。要理解其原 因,假设系统工作于一个大型的网站如 a m a z o n . c o m,支持成千上万个同时访问的用户,每一 用户有一相应的C O M对象表示他们的采购行为,存储在 S e s s i o n对象中。现在,假如我们知道 组件需要1 0 K B内存来执行和维持采购行为,估计在高峰时有 5 0 0 0个活动的S e s s i o n,需要5 0 0 0 ×1 0 K B (大约5 0 0 0 0 K B或4 9 M B )来维持这一个组件。即使内存比较便宜,对于这个问题也要引 起足够的重视。 选择用于创建组件的工具,有助于我们实现其他一些无状态组件的关键设计。通过 Vi s u a l B a s i c创造的组件的类型应该仅仅存在于一个应用程序的页面范围之内,通过 V B创造的组件不 应存储在S e s s i o n中或者应用程序级的变量中,任何这样做的企图将导致 We b服务器性能严重 地下降,可以配置 A S P从而产生一个错误信息,防止这种情况的发生。通过这种方式,在创 建一个We b的应用程序时, A S P自身促进无状态组件的使用。这取决于 V B组件可以支持的线 程模型。 15.2 单元和线程模型 作为VB ASP的开发人员,不需担心单元和线程模型,但应该意识到它们是 C O M +的基本 组成部分。理解它们之前首先需要理解线程。 15.2.1 线程 简单地说,可把线程看作“轻量进程”,不像通常的进程,线程并不是实际的系统资源, 在Wi n d o w s下启动一个运用程序,如 N o t e p a d,操作系统将创建应用程序在其中执行的一个进 程,这个进程将有其自己的地址空间,因而独立于其他进程,这样即使这个应用程序出现严 重错误,将保持其他应用程序的完整性。 在一个进程中总是至少有一个线程,称为主线程。一个线程是操作分配 C P U时间最基本 第1 5章 C O M +应用程序计计467 下载