6

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

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

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

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

4

2 回答 2

8

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

文章中的一些关键点:

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

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

于 2010-07-16T15:50:04.077 回答
7

@M Schenkel,看到这个问题Delphi 的 TADOConnection 线程安全吗?. 每个线程都需要自己的连接,因为 ADO 是一种基于 COM 的技术,并且它使用单元线程对象。

看到这个样本

procedure TMyThread.Execute;
begin
   CoInitialize(nil);
   try
     try
       // create a connection here
     except
     end;
   finally
     CoUnInitialize;
   end;
end;
于 2010-07-16T15:49:45.140 回答