好的是在线程中使用TADOConnection

时间:2010-07-16 15:39:46

标签: delphi adoconnection

我创建了一个TCPip服务器应用程序。该应用程序有一个全局TADOConnection。此全局ado连接既用于主线程查询,也用于线程进程。

这可以吗? ADOConnection是否内置了同时处理多个查询的机制?

我的应用程序可在测试环境中找到(2-5个连接)。但是在生产环境中部署时,我发现链接到ADOConnection的TADOQuery被设置为打开时“无法解释”的访问冲突。

我应该使用ADOConnection还是所有查询都应该自己连接到数据库(这可能需要更多资源)?

2 个答案:

答案 0 :(得分:8)

每个线程都需要拥有自己的连接对象。以下链接提供了更多信息:http://delphi.about.com/od/kbthread/a/query_threading.htm

文章中的一些要点:

1]在使用任何dbGo对象之前,必须手动调用CoInitialize和CoUninitialize。未能调用CoInitialize将导致“CoInitialize未被调用”异常。 CoInitialize方法初始化当前线程上的COM库。 ADO是COM。

2]你不能使用主线程(应用程序)中的TADOConnection对象。每个线程都需要创建自己的数据库连接。

答案 1 :(得分:7)

@M Schenkel,看到这个问题Is Delphi’s TADOConnection thread-safe?。每个线程都需要自己的连接,因为ADO是基于COM的技术,它使用单元线程对象。

参见此示例

procedure TMyThread.Execute;
begin
   CoInitialize(nil);
   try
     try
       // create a connection here
     except
     end;
   finally
     CoUnInitialize;
   end;
end;