在线用户    站点地图 技术论坛 文档中心 站点导航 资源下载 语言参考 教程专题 站点统计 业务项目 使用帮助
您的位置
MSDN参考新加了CSS2参考,全中文,制作精良。245k下载。           新加了sxf_sxf推荐的"动态网页专家指导" 下载!          新加了lsg2002lsg推荐的"ASP.NET高级编程(PDF)" 下载!          新加了DHTML代码预览!!,功能强大哦!欢迎试用          新加了网友lincong为大家提供的SQL Server 2000 程序员指南,有点大,但同时也就说明内容全咯!           新加了网友ibra为大家提供的北大的JAVA课件,很适合初学者入门           新加了一个java的连接缓冲池代码示例           新加了人月神话电子版下载!软件工程巨著哦~~           更新了评分标准,引入了“专家分”概念,相信可以更好的激励大家的学习!详情请看“使用帮助”           新加了由网友GGG提供的“IIS超级管理手册”,值得一看哦!(虽然我没看过 :P )           新加了“英雄榜”,欢迎测试!           “无组件上传·从原理剖析到实践”已经全部完成,源码全部开放,有兴趣的朋友请到文档中心一探究竟。  您的位置  首页>文档中心>Delphi>文档A0000508 在同一窗口中打开页面中的链接 在新窗口中打开页面中的链接 将ASPCHINA设为首页 将ASPCHINA加入书签    
 LOGIN HERE
用户:
密码: 忘记密码
记住密码 用户注册 游客进入
相关文章

MTS组件的创建过程

用VB实现COM+组件配置
发表文章
在Delphi6中使用COM+对象池

原作者:Vincent Parr     提交人:dockbar     发布时间:03-10-20     文章类型:转贴     浏览量:3055
参考链结:http://www.2yup.com    
关键字:COM+|对象池
[本文档没有附件]
字体:    视力保护色: 杏仁黄  秋叶褐  胭脂红  芥末绿  天蓝  雪青  灰  银河白(默认色) [A0000508]

典型情况下,当客户应用程序要实例化一个COM+对偶时,运行时的COM+就会为该对象创建一个新的实例。当 你的客户程序使用完该对象时,COM会销毁这个对象。这样会非常有效地使用内存资源,和在正常创建时 提供一个可接受的性能。

  可是,对对象进行频繁的创建和销毁时就成为相当高的花费了。尤其是你的COM+自己分配资源、实例化其它对象时等等。

  在这些情况下对象池通过减少对象必须被实例化和破坏的时间帮助我们解决问题。当这个池有效时,如果一个客户程序要求对象,它将会搜索对象池中是否已经有已经准备好的合适对象可以使用。如果找到了,COM+系统将会提供和激活这个对象,否则,COM+系统会创建一个新的对象以供使用。当客户程序使用完这个对象后,COM+系统不会破坏这个对象,而是把它放回对象池以供以后重新使用。

  要从COM+获得最好的性能,你的对象应是无状态的,要使用对象池,它们必须是无状态的对象。

Delphi6的对象池

    支持对象池在Delphi6中生成COM+对象是很简单的。然而,有些事你是必须请注意的。

    线程模型(Threading model)
   
    首先,你必须选择线程模型,否则,对象池将不可用(在New Transactional Object对话框中选择)。

  如果你产生了这个错误,不要担心,这很容易修复。新的事务处理对象向导可以为你生成代码,像如下所示:
*****************************************************************
initialization
  TAutoObjectFactory.Create(ComServer, TMyCOMPlusObject, Class_MyCOMPlusObject,
    ciMultiInstance, tmBoth); // 确保是tmBoth.
*****************************************************************

IObjectControl.CanBePooled

  COM+对象必须实现IObjectControl接口。Delphi的TMtsAutoObject类为我们做了这样的工作。当一个COM+对象处于非活动状态,COM+将调用IObjectControl接口的CanBePooled方法。如果这个方法返回True,这个对象就已经添加到对象池中了,否则,它将会被破坏掉。要确认这个方法返回True,你需要把Pooled设置为True。做这件事的最好时机是在Initialize方法中,对于它我们可以很容易地进行重载。

******************************
procedure TMyCOMPlusObject.Initialize;
begin
   inherited;
   Pooled := True;
end;
******************************

在CoClass中打开对象池

  最后,COM+对象的CoClass在类型库编辑器中的COM+表项中有一项设置,在那里你可以设置对象池是否可用,和设置该对象在对象池中被破坏前所保留的时间。这项设置在我的测试中似乎没有产生效果,但是,Delphi的帮助说该选项必须选上。

你的池到底有多大

  要从使COM+对象池可用是很简单的,但是,要设置这个池则有些挑战性。为什么这么说呢?因为如果你设置错误,你的程序将产生严重的性能下降。

  池的最大值是临界设置。如果对象池中没有可用的对象,新的对象将会被创建,直到达到池的最大值,之后新的请求就不得不排队等候了。如果在对象创建超时还没有可利用的对象,该请求会返回一个错误。你的客户程序必须有错误捕获机制来处理这种可能性。

  池的最小值决定对象池中任何时候需要保持的最小对象数目。对象会在程序起动时自动创建--这项设置对预先创建对象很有用,因为对象可以被客户立刻使用而不需要等待。设置一个大的值可以提高性能,不过程序起动时需要更多的内存空间。

  改变这项设置后,你需要重新起动计算机

Stats ’n’ stuff

  当然,你很希望通过简单的起动对象池而实现,你将会立刻看到你的应用程序有很大的性能提升。常常这又很难用量去衡量(是否该页比以前加载时快了呢?也许吧?)。差别也许是应用程序的运行有所提高,或是应用程序实际上比以前更坏。COM+提供了一些统计信息,以使你明白到底发生了什么事。

使对象统计可用

  在Component Services administrative tool的明细面板里右键点击你想要设置的组件,然后选择属性。在组件属性对话框里点击Activation项。要使组件的统计功能起作用,选择Component supports events 和 statistics 复选框。

监视对象状态

  在Component Services administrative tool的控制树里,展开包含你要监视的组件的应用程序组。右击组件组,指向View,然后点击Status View。现在明细面板将会显示应用程序中所有组件的状态。

以下显示Status View中的列:

********************************************************************************
 列                    描述
ProgID            标示特定的组件
Objects            当前客户所持有的对象数目
Activated           当前激活的对象数
Pooled            池中创建的对象数,包括当前使用中的和没有被激活的
In Call            标示正在调用的对象
Call Time(ms)         在过去20秒的平均调用时间
********************************************************************************
发现真相

  要知道我们究竟从对象池中得到什么好处的最好办法就是去测试和没有使用对象池时性能表现。测试池的最大、最小值对于你的硬件系统的表现。并且监视你的系统CPU和内存使用量,然后,你必须权衡CPU和内存的使用量进行最后的设定。

  当我在写这编文章时,我很希望能找到一此关于对设置COM+有说服力的文档,但是我没有那么幸运。

关于这篇文章的评论 [注意:这里仅仅是给大家提供了一个发表对文章本身看法的地方,如果有疑问,请到论坛提出] 我要提问!
标题
内容
发言
*您尚未以注册用户身份登录,不能发表评论。这里登录
您的位置
  (c)2000-2020 Yup Studio, all rights reserved.  
54.6875