6

TCPip サーバー アプリケーションを作成しました。アプリケーションには 1 つのグローバル 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 に答える