各位大虾:
     1、多线程能否使用一个ado连接,有人说ado不是线程安全的,也就是说使用一个连接多线程必须同步?是否有必要每个线程分配一个ADO连接?
     2、线程A和线程B操作一个表C:A往C的记录末插入一条记录,B读出C的第一条记录,并删除该记录。A和B的操作都比较频繁。会不会出问题?有没有比较好的解决方法?
      欢迎讨论!
  谢谢!

解决方案 »

  1.   

    如果你对COM的理解还可以。应该懂得:
    ADO也是基于COM的。它提供了一个双重接口:对本地操作是ADODB的程序ID,对远程操作是ADOR的程序ID。虽然注册表像使用分室线程模型那样显示ADO线程,但ADO库本身是种自由线程。ADO的线程安全依赖于你所使用的OLE-DB提供者。换言之,如果使用Microsoft的ODBC OLE-DB提供者,不会有任何问题。如果使用第三方的OLE-DB提供者,要在假定ADO线程安全之前检查厂商的文档(这是在Internet或企业网连接上使用ADO时的要求)。ADO库本身是种自由线程!!===》所以最好还是进行同步处理!!可以参考:
    http://www.ddvip.net/program/vc/base/18.htm
      

  2.   

    读写数据库还是要注意线程同步的,要不,即使没问题,读的也是dirty data
      

  3.   

    to oyljerry(☆勇敢的心☆-Paper Reviewing):
        那样做,会不会影响效率
      

  4.   

    多线程能否使用一个ado连接,有人说ado不是线程安全的
    =====================================================
    这句话是不对的.自从MDAC2.6以后ADO已经是线程安全的了.
      

  5.   

    1.一个线程用一个ADO连接,若多个线程访问同一个表则进行同步操作。
    2.一个线程隔60s或多长时间一次取出若干条数据,如10条,存入数组或结构体保存,然后再进行操作,另一个将处理的数据暂时存放在数组或结构体,隔60s或多长时间一次写入数据库中。
    这样应比较好。
    欢迎高手指正。
      

  6.   

    to jinxuliang(smielfox):
        也就是说可以在多个线程中使用一个ADO连接了,那么其效率比一个线程开一个连接要高,还是低?
        win2000 sever下ado是不是MDAC2.6?
      

  7.   

    引用:
    (http://www.microsoft.com/china/MSDN/library/archives/technic/develop/ADO.asp)
    ADO在其实际运行中得到了很高的评价,内存覆盖,线程安全,分布式事务支持,基于Web的远程数据访问.作为Microsoft UDA策略的一部分,ADO试图成为基于跨平台的,数据源异构的数据访问的标准模型.随着时间的流逝,它将取代其他模型.ADO集中了RDO和DAO的所有最好的特性,并将它们重新组织在一个同样可以提供对事件的充分支持的略微有点不同的对象模型中.如果你想深入的钻研一下Microsoft的数据访问技术之间的不同,你可以看看 “Data Access Technologies”,这是由Robert Green写的MSDN的关于技术性方面的文章.
    ---------------------
    WIN2000 server系统装了以后MDAC是默认的2.6.你可以到微软站点去下载,最新的为MDAC2.8
    ---------------------
    至于你问开连接的是在多个连接,还是一个的问题.
    我没有测试过.但个人意测:(没有测试和准确的理论依据)
    使用多个连接系统开销要大一些,而且会读到脏数据.因为在select的时候并不锁定数据库.而且在单cpu系统中,这并不能显著提高效率.
    为了解决脏数据最好还是采用读写锁,或者行级锁定.
    个人建议,开一个连接比较好.用多个连接,比较容易出现未知问题.
      

  8.   

    ado是线程安全的,但多个线程在访问同一个表时,要注意逻辑上的关系,即同步
    若一个线程只是访问一个表,而这个表其它并不访问,不需同步,就采用一个专用连接。
    若多个线程访问一个表,则要注意同步,不管是一个公用连接,还是一个线程一个连接。
    我的理解应该没有问题吧?