DCOM应用服务器线程模式(参与讨论就有分) ( 积分: 200 )

  • 主题发起人 主题发起人 高小五
  • 开始时间 开始时间

高小五

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个项目用Dcom + Dbexpress + Oracle开发,线程模型采用了tmApartment,当客户端连接超过10个以后,应用服务器有时会占用所有的CPU资源,然后失去响应。这种情况很频繁,一天出现好几次。找不出问题所在。今天将远程数据模块的线程模型从tmApartment修改成了tmFree。情况好像好多了。我从borland网站上查了线程模型的差别:
http://bdn.borland.com/article/0,1410,27860,00.html
但用这两种模型还不是很清楚,比如用tmFree,在一个客户端调用了一个接口中用了SQLQuery1.Close ;而另一个客户端正好引用SQLQuery1.FieldByName('xxx').XXXX,这样两个客户端会不会冲突。各位兄台能否为小弟解说一个线程模式及冲突问题。感谢。
 
我的一个项目用Dcom + Dbexpress + Oracle开发,线程模型采用了tmApartment,当客户端连接超过10个以后,应用服务器有时会占用所有的CPU资源,然后失去响应。这种情况很频繁,一天出现好几次。找不出问题所在。今天将远程数据模块的线程模型从tmApartment修改成了tmFree。情况好像好多了。我从borland网站上查了线程模型的差别:
http://bdn.borland.com/article/0,1410,27860,00.html
但用这两种模型还不是很清楚,比如用tmFree,在一个客户端调用了一个接口中用了SQLQuery1.Close ;而另一个客户端正好引用SQLQuery1.FieldByName('xxx').XXXX,这样两个客户端会不会冲突。各位兄台能否为小弟解说一个线程模式及冲突问题。感谢。
 
没有人知道吗?参与讨论有分。
 
我不知道,对不起,无法解答,如果有答案请给我一份谢谢,我菜
 
1.服务器在做界面处理的时候有没有作线程安全的处理
2.可不可能因为某些原因数据库不行了
 
程序正常运行快一周了,就是线程模式的问题.tmApartment模式线程数太多.用tmFree模式线程较少.
 
关于线程模的的理解,COM线程模型有4种
其中 tmApartment 称为单线程套间模型 :
  套间 是一个COM的术语, 有点像一条隧道,客户端要进行COM调用,调用所在的线程
就必须穿过隧道
tmApartment 一次只有一个线程能在套间中,
     假设两个线程(两个客户调用)同时调了某个COM接口,那么只有一个线程能进
入,其作的线程在套间外排队,直到套间中的线程退出。
对于这种模型,将并发串行化了,所以编写COM服务时无需考虑线程安全问题。
    
    但是这种调用如果直接使用,效率肯定低。
    但是有没有可以优化的方法呢?
    有。
    减少 调用线程,在套间中的驻留时间 。
    方法,可以是异步调用,当客户执行一个COM调用时,服务器将调用加入消息队
    列,调用返回,再起一个线程,从消息队列中读取调用,再处理,将结果返回给相
    应的客户端。
      这种优化方法,减少了处理服务器线程安全的问题
tmFree 即自由线程模型
采用这种模型 ,要求COM组件有的服务方法,必须是线程安全的,可重入了,
  即A客户调用执行了一部分,可能被中断,执行其它客户端的调用
    
       

 
 
改成 Neutral 看看怎么样?
 
Neutral 理论上会像 Apartment 一样节约资源,但是效率和Free一样好。
这得益于DataSnap的连接是无态的。
 
哪各位兄弟,相对来说,哪种方式相对来说更好一点呢
 
各有各的好处, 看你如何用?
tmApartment 搞得好也能达到 tmFree 的效果,
归根到底 就是 并发串行化的问题, 同步调用与异步调用的问题
 
to djh_djh:如何优化tmApartment的执行,有代码码
 
改成tmFree模式正常了,因为应用服务器不能随便停,所以没有试Neutral.是不是Neutral只用于com+?我用的是DCOM.
 
tmApartment 模式
如果 是单实例执行,就没办法了,只有 一个个排队,
 多实例执行, 不要多实例共享一个TSession
 也不要一个 实例一个Session
 如上所说, 把任务放到队列中, 启动几个线程依次执行任务, 一个线程一个TSession
 
又学了一招
 
散分了,感谢各位
 
后退
顶部