プリペアドステートメントとの単一の接続を使用するプログラムを作成しました。これまでのところこれは機能しますが、プールされた接続の使用に移行しています。
プリペアドステートメントは接続プールと一緒に使用されると想定していますが、実際にどのように使用されているかを理解することはできません。
接続オブジェクトを保存するのではなく、実行するクエリごとに新しいオブジェクトを作成すると思います(プールされます)。
私がこのようなものを使う前に:
//Single connection at startup
var conn = NpgsqlCommand(...);
...
//Prepare all commands once at start-up
var cmd = new NpgsqlCommand("INSERT...", conn);
cmd.Parameters.Add("id", NpgsqlDbType.Integer);
cmd.Prepare();
...
//Using the command multiple times later on
cmd.Parameters["id"].Value = 4312;
cmd.ExecuteNonQuery();
プールされた接続を使用している場合、これらのコマンドを準備するにはどうすればよいですか?
接続ごとに1つの準備されたコマンドが必要になると思いますが、プールの誰でも接続できる場合は、準備されたコマンドを取得する方法も必要です。
プーリングでも新しい接続を作成できると思いますが、呼び出しごとに、新しいコマンドセットを準備する必要がありますか、それとも新しいNpgsqlCommandを作成して準備し、実行しますか?
いくつかの背景:
私の現在のセットアップは、1人のユーザーを使用したテストであり、数回の呼び出しのみで、すべてが順番に行われます。後で、これは並列実行を伴うマルチユーザー/マルチスレッドサービスになります。
独自の接続プールを作成し、新しいスレッド用のコマンドを準備するための独自のコードを作成する方法はわかりますが、これを作成する必要はないと思いますが、間違っている可能性があります。
私はNpgsql(PostgreSQL)を使用していますが、可能であれば一般的な解決策をいただければ幸いです。