2

さて、デリゲート ドライバーを適切にセットアップすることができましたが、接続プーリングが依然として多くの問題を引き起こしています。

ドキュメントに記載されている説明から、接続プールは次のように機能するはずです。

  • 単一のグローバル接続オブジェクトに DBXPool ドライバー デリゲートを設定する
  • データベースへのすべての呼び出しにこの接続オブジェクトを使用します
  • 各 DB 呼び出しは、デリゲート ドライバーを介して、接続プールが所有するそのスレッドに固有の接続に自動的にルーティングされます。

実際には、すべてがまだグローバル接続オブジェクトによって処理されているように見え、複数の同時スレッドから DB クエリを実行しようとすると、あらゆる種類の奇妙な競合状態とクラッシュが発生します。

参考までに、DBX 固有のコンポーネントはあまり定義していません。通常、Connection.Executeメソッドを呼び出してクエリを実行します。

私が間違っていることは何か分かりますか?どこかで手順が抜けているのでしょうか、それとも DBXPool デリゲート ドライバーがどのように機能するかをよく理解していませんか?

4

1 に答える 1

2

Delphi にはサンプル プロジェクト DelegatesSample が付属しています。私のマシンでは、\Documents\RAD Studio\8.0\Samples\Delphi\Database\dbExpress\Delegates の下にあります。

プール内の各接続には、独自のTDBXConnection オブジェクトがあります。サンプル ソース コードでは、各接続は への呼び出しによって作成されますTDBXConnectionFactory.GetConnectionFactory.GetConnection()

もちろんご存じのとおり、スレッド内の各クエリには独自の接続オブジェクトが必要です。

Felix Colibri も、Delphi DBX4 プログラミングに関するすばらしい記事を書いています。そこで彼は、プーリング デリゲート ドライバーを使用したデータベース接続のプーリングについても説明しています。

少なくともこれらのサンプルは、接続プーリングがどのように機能するかを理解するのに役立ちました!

于 2012-07-13T10:48:07.690 に答える