阿朱原创:如何减少ADO的连接数以及如何通过事务隔离级的调整提高COM的性能 (0分)

  • 主题发起人 主题发起人 阿朱
  • 开始时间 开始时间

阿朱

Unregistered / Unconfirmed
GUEST, unregistred user!
如何减少ADO的连接数,那首先就要明白ADO什么时候需要创建一个新连接?
------------------------------------
发出SQL的机器不同,要新建连接
即使符合上述条件,连接的数据库不同,也要新建连接
即使符合上述条件,连接的用户名不同,也要新建连接
即使符合上述条件,不同的exe发出的SQL,也要新建连接
即使符合上述条件,同一个EXE的不同ADOCONNECTION发出的SQL,也要新建连接
即使符合上述条件,当前这个连接正在有SQL发送或数据接收,也要新建连接

这些因素不会新建连接:
连接的事务隔离级不同
同一个exe的不同线程发出SQL

什么时候释放一个连接?
------------------------------------
我们做了两个实验:在WINOWS2000 PROFESSIONAL和SERVER上都做过

这是ADO放在COM的效果:
ADO.KEEPCONNECTION=False或True
没有SETCOMPLETE,或者加上
组件服务中的超时时间60秒,即使改变也没效果
DCOM用完就关
发现,一个由COM激活的连接,都是需要1分钟才释放,这个时间是精确的.但是只要我kill这个包dllhost,就

会立即释放

这是ADO放在EXE的效果:
ADO.KEEPCONNECTION=False或True
发现,一个由EXE激活的连接,如果ADOQUERY没有CLOSE,如果EXE不关闭,连接一直存在,如果ADOQUERY有

CLOSE,连接也不会立即释放,而是1分钟后释放。如果关闭EXE,就会立即释放.

从以上可以看出,如果一个客户端连接的EXE关闭后,连接后立即释放,如果客户端一直不关闭,而ADOQ用完就

CLOSE,那么连接会在1分钟后释放。如果ADOQ用完也没有CLOSE,连接一直存在。庆幸的是:ADOQ Free时,会

自动CLOSE;

建议:多个DLL在一个包,一个DLL中的COM公用一个ADOCONNECTION


COM+的事务属性
-------------------------------------
COM+的事务默认级别是序列 Read,而不是我们认为的commit Read,而且我们设置AdoConnection的隔离级是不

管用的,只能强制用显式的SQL才能起效果。
例如:
一个中间层COM
select * from a where py_code like 'S%'
继续下面有很多代码
另一个中间层COM
update a set py_code=py_code where py_code like 'B%'
这时这个COM将会死锁等待,虽然改动的不是一个数据也会死锁
用Commit Read 或UnCommit Read不会

建议:
所以被多个子系统更新或读的表,要在最后打开和更新,不要早。另外可以强制改变ADOCONNECTION的隔离级



 
好,收藏。
 
好帖子......收藏!
[8D][8D][8D][8D][8D][8D][8D]
 
接受答案了.
 
后退
顶部