A: 问题的根源在于COM+ 如何assign一个worker thread 来用于clients 的CreateObject 请求。在COM+ 1.0 (Win2000)下,如果机器是单CPU, STA thread pool 的起始大小为 8, 上限为10。通常情况下每个STA worker thread 会接受5个CreateObject 请求,然后COM+ runtime才决定create新的STA worker thread. 这样达到的效果是: 两个或多个objects会共享同一个STA worker thread.
假设obj1 和obj2 共享 一个STA worker thread. 如果obj1正在呼出自己的aparment (比如调用另外一个进程里的objects等等), 恰好这时clients请求obj2的方法调用,根据STA apartment的可重入性(reentrancy), obj2会允许获得在该STA worker thread 上执行的权利。而obj1在完成自己的呼出后必须重新要求获得对该STA worker thread的控制权。一种极端的情况时,如果obj2执行的操作很长时间不返回,那么obj1必须等待。

回到原来的例子中,假设obj1和obj2都属于component A, 然后b属于component B,obj1创建了b. 当A 和B都在同一Server package中时候,obj1和b 属于同一apartment (进一步属于同一com+ context), 这样在obj1 呼叫b的时候,并没有呼出apartment, 所以调用都是同步的 (换句话说,此时即使有clients调用obj2的请求也必须等待obj1完成后方可)。与之相对比的是如果AB配在不同的server package中,那么obj1呼叫b时候则允许obj2也允许在该STA worker thread 上同时执行 (在本例子中调用后台的SQL2K)。换句话讲DCOM 在处理STA呼出时候是区分该呼出是在同一还是非同一apartment中的。obj1在完成呼叫b后需要重新获得对其STA worker thread 的控制权才能要求DTC提交transaction。这样的话obj1要等待obj2完成对数据库的调用(obj2通常是在update/insert tables), 而obj2要等待obj1提交transaction从而释放占有的locks。 Deadlock!!

从上面的分析我们可以看到,最有效的方法是不使用STA thread pool而使用MTA thread pool (就是把component封装到MTA 中)。 MTA thread 的好处是objects跟thread 没有绑定关系,obj1执行完后不比等待重新进入创建他的thread;另外MTA worker thread的大小没有上限。

作为一个workaround,我们可以要求STA worker thread开始时候每个object都获得一个单独的worker thread, 从而最大限度减少因为两个objects共享worker thread引起的deadlock, 这就是Q303071里面所讲的。

转载于:https://www.cnblogs.com/Snowwolf/archive/2004/05/21/10609.html

Q: 为什么如果我们把这两个组件安装在同一个COM+组件包中问题就不会出现(zz)...相关推荐

  1. Linux上两种软件安装方式

    Day 8 安装包获取 安装包获取: 1.本地获取 2.网络获取 第一种安装方式 rpm 安装工具 (包名,软件名) .rpm 格式的安装包 eg:-r--r--r--r. 1996 root roo ...

  2. centos下两种方法安装git

    centos 5 64位下两种方法安装git 这里来给大家介绍下编译安装和yum安装git.   系统:centos 5.5 64位   需要的软件包:git-latest.tar.gz epel-r ...

  3. R语言使用zoo包中的rollapply函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)、例如,计算两种商品销售额之间的3个月的滚动相关性

    R语言时间序列数据滚动相关性分析(Rolling correlations).R语言使用zoo包中的rollapply函数计算两个时间序列数据列之间的滚动相关性(Rolling correlation ...

  4. ebc是什么意思_UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别

    UEFI+GPT和Legacy+MBR两种模式安装的系统有什么区别?很多电脑小白都搞不懂UEFI.GPT.BIOS.MBR到底是什么意思,下面跟随小白系统一起深入了解下UEFI+GPT和Legacy+ ...

  5. onclick=两个函数_[译]React函数组件和类组件的差异

    [译]React函数组件和类组件的差异 原文: https://overreacted.io/how-are-function-components-different-from-classes/ 在 ...

  6. legacy bios与uefi两种模式安装windows8操作系统的方法

    在Legacy BIOS与UEFI 两种模式安装Windows 8操作系统的方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-10 16:18:23 我要评论 不是所有WIN8都可以安 ...

  7. python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)

    使用limma包进行差异基因分析时,做最多的是两分类的,例如control组和disease组,但也会碰到按照序列进行的分组.这时,如果逐一使用两两比较求差异基因则略显复杂.其实开发limma包的大神 ...

  8. GDCM:读取两个DICOM文件保存在另外dicom文件中的测试程序

    GDCM:读取两个DICOM文件保存在另外dicom文件中 GDCM:读取两个DICOM文件保存在另外dicom文件中 GDCM:读取两个DICOM文件保存在另外dicom文件中 #include & ...

  9. 【SQL Join】两个字段关联到同一个表,如何使用left join

    Join 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. JOIN: 如果表中有至少一个匹配,则返 ...

最新文章

  1. 如何強迫 .Net 應用程式輸出英文的例外訊息
  2. winform 后台线程更新UI
  3. hpuoj--校赛--与学妹滑雪(最短路+精度判断)
  4. C语言中 *.c和*.h文件的区别!
  5. SAP License:MM模块审批策略问题
  6. 产品研发过程管理专题——编写软件测试计划需要考虑的几个问题
  7. redis的安装和命令的使用(史上最全命令集合)
  8. Mathtype使用技巧(一)
  9. EPLAN中如何画屏蔽双绞线
  10. Chrome谷歌浏览器连接路由器不上
  11. #读书笔记—《自控力》第一章
  12. 微信分享自定义图标大小限制_微信分享时安卓的自定义参数无效的解决办法
  13. 如何配置 Cilium 和 BGP 协同工作?
  14. python三维雷达图_Matplotlib绘制雷达图和三维图的示例代码
  15. tushare实战分析美元黄金与美债收益率、利率的关系
  16. java一元多项式减法运算_一元多项式的表示及加减乘除运算
  17. 使用howler做一个音频播放器到底有多简单
  18. 专精特新软件开发类企业实力指数发布,麒麟信安荣誉登榜
  19. 【蓝桥杯集训100题】scratch太极图 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第22题
  20. 数字化成熟度:迈出数字化转型的下一步

热门文章

  1. boot spring 获取请求端口浩_Spring精华问答 | 如何集成Spring Boot?
  2. linux系统调用记录模块实验报告,华科操作系统实验报告(DOC)
  3. File类的创建功能
  4. mysql 8.0 java连接报错:Unknown system variable 'query_cache_size'
  5. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器
  6. 浅谈ASP.NET的内部机制(二)
  7. 同一个类里方法互相调用注解失效问题
  8. Protobuf生成Java代码(命令行)
  9. 获取access_token
  10. CSS 实现必填项前/后添加红色星号