事务隔离级别的配置
COM+应用程序开发人员可以根据需要使用新的TxIsolationLevel属性或组件服务管理工具来配置应用程序的隔离级别,提高应用程序的并发性、性能和可伸缩性,这使得有经验的开发人员能够挤出应用程序的所有潜力。COM+ 1.0只是适度地考虑了事务的隔离,它只允许串行化事务,这也是隔离级别最高的一种方式。在串行化事务模式下,一系列并发事务的结果与连续地每次只运行一个事务得到的结果是相同的。如此高的隔离级别是以牺牲整个系统的效率为代价的,因为在一个事务运行期间,资源管理器必须掌握系统的读、写权,而且其他所有的进程也必须被阻塞。
另一方面,在考虑系统的可靠性时,也需要降低其隔离级别。例如,一个ATM(自动银行出纳机)系统需要访问用户的银行帐户中还有多少钱,尽管可以以串行化隔离级别执行这种事务,但可能会同时有数十万个用户同时使用该ATM系统,就需要相当长的时间才能完成事务。如果其他事务也在同一时间内访问一些帐户,事务就可能超时或被异常终止。因此,帐户的数量就成为事务能否完成的关健。如果我们从统计学意义上来考虑该问题,如果事务以较低的隔离级别运行,一些帐户就会出错但这些错误的帐户能够阻止其他事务的执行。发生错误的概率可能是银行所能接受的。
在COM+ 1.5的环境中,我们能够配置事务组件的隔离级别。Transactions标签上有一个包含有5种隔离级别的下拉式列表框,可用的隔离级别为任意、不可读、可读、重复读、串行化。隔离级别的缺省设置是串行化。
服务激活类型
新的COM服务允许我们对一个服务器应用程序进行配置,使它象系统服务那样运行。有了这一功能,我们就可以不依赖于客户端的激活请求,在计算机启动之后就让应用程序立即处于运行状态,这也是让应用程序在系统帐户中运行的唯一方法。系统帐户是计算机上功能最强大的帐户。
我们能够在应用程序的“激活”标签上看到“以NT服务方式运行应用程序”检查框,一旦点击该检查框,就可以通过点击“设置新服务”按钮配置不同的服务参数,使得我们无需再使用控制面板中很难使用的服务管理程序。
进程转储和应用程序转储
生成转储文件有多种方法,对COM+分类以生成应用程序故障时的内存映象是一种主要的方法
发现并解决故障是一个并不轻松的问题,那么我们如何在不破坏正在运行的情况下收集信息呢?COM+通过进程转储给出了一个明确的答案,开发人员可以利用这一功能在不终止进程运行的情况下转储它完整的状态。为了进行调试和分析,有时候得到一个应用程序的内存情况的转储非常重要,尤其是在应用程序崩溃的情况下。COM+ 1.5使我们能够获得运行COM+应用程序的进程的静态内存映像的转储我们可以使用WinDbg这样的工具浏览和分析得到的内存映像。
所有的COM+ 1.5应用程序在其属性页上都新增添了一个被称作“转储”的标签,可以在其中设定转储的地方和内存映像的数量。一旦达到设定的值后,新转储的内存映像就会覆盖掉最早的内存映像。我们在COM+ 1.5中能够保存的内存映像最多为200个。
生成转储文件有多种方法,对COM+分类以生成应用程序故障时的内存映象是一种主要的方法。第二种方式是在处于运行状态中的应用程序的弹出式快捷菜单中选择“转储”选项。此外,我们还可以通过使用ICOMAdminCatalog2界面的DumpProcess方法直接生成转储文件,其定义如下所示:
[id(0x1f)] HRESULT DumpProcess([in] BSTR bstrApplicationInstanceId,
[in] BSTR bstrDirectoryName,
[in] long lMaximumImages,
[out,retval] BSTR* pbstrDumpToFile);
COM+ 1.5 Catalog根对象支持由COM+ 1.0中继承下来的ICOMAdminCatalog2。在使用DumpProcess方法后,我们需要给出转储文件所在的目录和文件名,而不能依靠原来配置时设定的值。生成正在运行的应用程序的转储文件不会破坏应用程序的运行,进程也不会中止运行,只是在转储的瞬间,进程会暂时中止运行。
在COM+创建一个转储文件后,它使用一种约定的命名规则给转储文件命名一个名字,使我们可以很方便地将一个转储文件与一次系统故障联系起来。为了防止对DumpProcess不必要的调用,ICOMAdminCatalog2有一种被称作IsProcessDumpSupported的技术,该技术可以用来发现计算机系统是否支持内存映像转储。
增强的工作环境激活设置
在COM+ 1.0环境中,我们可以对组件进行配置,让它们使用JIT激活方法。此外,对配置的组件要求它必须在创建者的工作环境中总是处于活动状态的,我们可以来检查组件属性页中的“激活”标签上的“在调用者工作环境中必须处于活动状态”检查框来保证这一点。这就意味着配置组件使用使用“运行时”(JIT)激活模式需要有它自己的工作环境。这二种设置通常是受到限制的,如果这样对组件进行配置,就不可能成功。如果配置组件使用事务或强制安全访问检查也会冒不成功的危险,因为这些操作都需要有自己的工作环境。COM+ 1.5 Explorer对这个问题提供了一个很好的解决方案,其中包括重新设计了组件的“激活”标签和新的激活选项。
激活环境属性组包含有三个单选按钮,一次只能选择其中的一个。如果选择了“不剥夺激活工作环境”选项,我们就选择了普通的COM+工作环境激活活动。在这种方式下,我们可以使用JIT激活、事务、安全访问检查等。事实上,只要启用事务支持和访问安全,我们就不能再选择其他二个选项,启用安全检查就会将选择由其他选项恢复到“不剥夺激活工作环境”选项上。
新的COM服务添加一种被称为“在缺省环境中必须处于激活状态”的新的工作环境激活选项。当知道组件的客户端位于缺省的工作环境中时,就会频繁地调用组件,组件就不使用几乎所有的这一新选项可以使用的COM+服务。
COM+ 1.5中Web服务概览
.NET平台中最大的变化是支持Web服务,它能够分派一个Web站点的中间层组件调用另一个Web站点上中间层组件的方法,并使这一过程简单得就象这二个组件在同一个站点和计算机上那样。但使用.NET Web服务也需要付出一定的代价,因为开发人员必须在学习和掌握C#等新的编程语言、编程模式和类库方面花费一定的时间和金钱,在大多数的机构中,这是一笔不小的开支。
为了在提供向.NET移植方法的同时保护在COM组件和开发技术方面的投资,只要组件符合Web服务的设计原则,COM+ 1.5可以将任何一个COM+组件作为一种Web服务。应用程序中的“激活”标签使得我们可以配置应用程序的SOAP激活,我们需要作的仅仅是指定与应用程序相关联的Web服务的目录,而COM+会以一种组件服务的方式提供必要的转接机制。COM+将Web服务与IIS安装在一起,生成合适的Web服务配置和信息文件。需要引起注意的是,计算机上需要安装IIS,以启动应用程序用的SOAP激活模式。
COM+ 1.5和.NET 的关系
开发人员使用象微软的Visual Studio 6.0这样的工具来开发COM+组件和在COM+应用程序中设置组件,来使用COM+服务。在Visual Studio .NET开发工具中,为了使用事务、对象缓冲池等COM+服务,可管理类是被内置和安装在COM+应用程序中的。Visual Studio .NET和.NET框架比Visual Studio 6.0提供了更好的工具、公共语言运行时间库和更容易编码的语法。每一个可管理的类可以被托管在一个共享的COM+工作环境中,因此,可管理类可以充分地利用所有的COM+服务。在.NET框架中,这些类被称作被服务组件。任何可管理类都可以进行修改、使用COM+服务,Microsoft.ComServices名字空间提供了各种各样的自定义属性和类,帮助开发者从可管理代码中使用这些服务。
微软的.NET框架仍然对所有的语言提供访问COM+服务的支持。ASP .NET、ADO .NET和Messaging等.NET中新增加的部分与.NET组件的集成程度很高,能够充分利用事物、对象池等服务。这种集成提供了一种一致的架构和编程模式。Microsoft.ComServices名字空间提供了各种各样的自定义属性、类和ServicedComponent类,提供了向可管理代码添加服务的编程模式。
在.NET 中使用COM+服务
事实上,这一标题的名称也许应该是“在.NET架构中使用COM+技术”。COM+服务拥有大量的企业级功能,这些功能非常复杂,要复制它们需要耗费大量的时间。即使是COM+服务最初的设计目标是与COM+组件一起使用的,但如果.NET组件能够使用COM+服务也会好得多。问题是被编译过的.NET组件和COM+组件的结构标准不同。COM组件遵循COM的二进制模式,.NET遵循的则是在公共语言规格(CLS)中描述的结构。为了让.NET组件使用原本为不同模式的组件提供的服务,有二个最基本的问题需要解决,.NET组件需要能够访问COM+服务对象模型下的对象,以便能够在代码中调用它们。
开发人员能够开发出特殊的只在可管理代码或可管理代码与不可管理代码相混合的系统中运行的组件,这一服务将能够被所有组件使用,因为每个组件的工作环境都是托管在COM+中的,COM+中的工作环境会以适当的方式从一个组件转移到另一个组件上。公共语言运行时间库和COM+服务联合自动地生成类型库信息,并完成注册,以便可管理类出现在COM+目录中。尽管真正的实现和执行是在运行时间库中完成的,但只有COM+负责维护工作环境的信息。在下面的代码中,Account类是继承System.ServicedComponent类生成的,由继承System.ServicedComponent类生成保证了Account对象的工作环境是托管在COM+中的。
Transaction属性标志着类需要事务,这与使用COM+ Explorer设置COM+组件的事务支持是等价的。AutoComplete属性用来表明,如果在方法执行的过程中发生异常,运行时间库必须自动地对事务执行SetAbort函数;否则,就调用SetComplete函数。各种组合体级的属性用来获得COM+应用程序级的注册细节。
#using
using System;
using Microsoft::ComServices;
using System::Runtime::CompilerServices;
nam