ADOConnection放在RDM中和放在DM中有什么区别?(100分)

  • 主题发起人 主题发起人 M16
  • 开始时间 开始时间
主要看你的应用是什么类型了。单机DM就可以了。RDM(德应该很清楚的remote data module)嘛由data module继承而来。与你的adoconnect没有关系。
 
可能是我说道的不清楚,我得意思是,在开发三层的过程中,服务器端可以又DM也可以有RDM,ADOConnection可以放在他们中的任何一个,那么区别是什么?
 
对前端而言,没有区别。
 
对服务器的连接当然是DM,RDM都可以啦。客户端向中间服务器上的连接必然要RDM.
 
我觉得最好用dm上的 adoconnection处理公用的数据库操作,rdm处理客户端的数据库操作
 
是不是这个意思呢?
在应用服务器上同时有数据模块和远程模块。
其中远程模块只负责供应数据给客户端
通过远程模块注册的应用接口则调用另一个元的数据模块?
这样岂不是又要负责同步了吗?程序更复杂了
我在前面某个贴子里说有个参数决定是排队的,好象在李维的书里有说

 
要求的是成功和成熟,想不复杂,可以吗???当然。那就一步一步的来。没有你做不到的,只有你没有想到解决的方案。
 
我现在的理解是:如果把ADOConnection放在DM中,由于我用得线程模式是Apartment和multiInstance,那么所有的用户都是只用一个连接呢,而如果是放在RDM上就会又许多得Connection连在数据库上。是不是这样呢?各位哥们!
 
用事件探测器是否可以测到这种变化呢?
 
如果把ADOConnection放在DM中,并不用处理同步,因为ADOConnection本身也是一个Apartment线程的COM对象
如果RDM要经常创建和销毁的话,就必须保持轻量级
或者用com+做缓冲
 
我看出来了,沉香屑,你一定很懂这个问题,我现在是用MultiInstance和Apartment方式,我不太明白在这种模式下哪里需要进行同步控制呢?最好能举个例子
 
MultiInstance和Apartment方式
决定了com对象可以同时被创建多个,但是每个com对象只能被一个线程访问
因此只需要保护com对象宿主程序中的全局量
也就是说,如果不做缓冲的话,就不需要保护
但是这种情况下,只有一个数据库连接,由于ADOConnection也是Apartment线程
所以会排队,并且容易出现数据库死锁
解决办法就是每个com对象都有一个独占的数据库连接
这样就必须采用com+,绕过重复创建数据库连接的开销
当然也可以在DM中同时打开多个数据库连接,自己做缓冲
 
to:沉香屑
1,你说的用Com+做缓冲是不是就必须用到MTS了?
2,还有就是,每个客户端连接到服务器是不是就对应着宿主程序服务器上的一个线程,而这也就是一个Apartment,而一个apartment中可以有很多的com对象,这些com对象,其实就是RDM,也就是说很多个RDM在一个Apartment里面。每个客户在他自己的Apartment中只可以同时访问一个RDM,是这样吗?
3,你说的自己手动缓冲是什么意思,给个大概的思路,可以吗?
 
1.是的
2.我以为可以这样理解:com对象生存在一个apartment中
这个apartment采用了STA线程,因此只能被一个客户端连接所访问
客户端会调用CoInitializeEx函数来创建apartment,由于设置了MultiInstance
所以宿主程序可以创建多个apartment,但是每个apartment中只有一个com对象,也就是RDM
3.一个apartment中可以容纳多个com对象,因此可以在这个apartment中创建
ADOConnection和ADODataSet,同样也可以传入外部的ADOConnection,自己做缓冲
原理是先创建多个全局的ADOConnection,在RDM创建时,分配一个ADOConnection给
RDM,并且做标志,这个标志是需要保护的,可以用TCriticalSection
同理,在析构RDM的时候,也要修改标志位,表示这个连接空闲
其实多个RDM共用一个连接问题也不大,但是一定要保护好标志位,免得浪费连接
同时避免出现ADODataSet忘记释放,一直连在某个ADOConnection上的情况
所以最好要有监控界面
 
客户端的CoInitialize函数是delphi自动调用,还是手动的写代码?我看李维的书上写着好像要手动添加,但是我没有添加,好像运行的也可以啊。
请沉香屑同志做答!谢谢
 
客户端无需调用CoInitialize函数,可直接调用DCOM的的创建函数。李维是指WINNT上的MTS需要,但WIN2000后的COM+不需要了。
 
RDM已经为 你实现了接口,并且提供了急于COM接口的注册功能,
DM只是一个逻辑处理或者是数据处理的单元
 
CoInitialize和UnInitialize已经被VCL封装了
一般不需要显式调用
 
看是两面层的还是三层的,两层的没有区别,三层的一个是服务器端,一个是客户端。
 
后退
顶部