2

ここStackOverflowで以前に質問されましたが、私の経験では、答えは実際には間違っていました。少なくとも .NET Framework 4.0 と SQL Server 2005 では、これらは間違っています。

これを完全に整理するには、助けが必要です。

問題は、ステートレス WCF サービスで何らかの方法でデータベース接続プールを使用できるかどうかです。

ステートレス WCF サービスを参照してください ...

以前の回答では、本質的に、問題はなく、他の ADO.NET シナリオとの違いはないと述べられていました。ただし、ステートレス WCF サービスで接続プーリング EVER を使用することはできませんでしたが、WCF サービスの外部では常に動作することがわかります。使用しようとしている接続文字列またはパラメーターに関係なく、それは行われません。

データベース接続プールはデフォルトで有効になっているため、たとえば SQL Server Express では、単純な接続文字列でアクセスできるはずです。

SqlConnection sqlCn = new SqlConnection("Data Source=SERVER\SQLEXPRESS; Initial Catalog = xDB; Integrated Security = SSPI;")

この接続を使用して、Windows フォーム アプリケーションでsqlCn.Open()-- query the database --を 3 回連続して実行するとsqlCn.Close()、最初の で長い遅延 (たとえば 2 秒) がsqlCn.Open()発生し、クエリとオープンでまったく遅延が発生しません。 / その​​後閉じます。まさに私がデータベース接続プーリングに期待していることです。

sqlCn.Open()しかし、同じコード (データベースのクエリ)を含む WCF サービスを 3 回呼び出すと、sqlCn.Close()1 回の呼び出しごとに最初の 2 秒間の起動が遅くなります。

私の推測では、接続プーリングはコードによって作成された ADO.NET オブジェクトによって完全に制御されておりSqlConnection、WCF サービス内で使用する ADO.NET クラス (など) をインスタンス化しているため、サービスが呼び出されるとそれらは破棄されます。終わり、接続プールもそれに伴います。

これは真実ではないかもしれませんが、そうでない場合、私が行ったことに何か問題がありますか?

誰でも経験がありますか?

(投稿する前に、仮定や理論をテストしてください)

4

2 に答える 2

0

1)ドキュメントは次のとおりです。

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

接続が最初に開かれると、接続プールは、プールを接続内の接続文字列に関連付ける完全一致アルゴリズムに基づいて作成されます。各接続プールは、個別の接続文字列に関連付けられています。新しい接続が開かれたときに、接続文字列が既存のプールと完全に一致しない場合は、新しいプールが作成されます。接続は、プロセスごと、アプリケーションドメインごと、接続文字列ごと、および統合セキュリティが使用されている場合はWindowsIDごとにプールされます。接続文字列も完全に一致する必要があります。同じ接続に対して異なる順序で提供されたキーワードは、個別にプールされます。

2)同じリンクごとに、「デフォルトでは、接続プールはADO.NETで有効になっています。」

3)これは、問題のWCF呼び出しがステートレスであるかどうかとは完全に独立しています。

4)最後に:

接続がプールに戻されるように、使用が終了したら常に接続を閉じることを強くお勧めします。これを行うには、ConnectionオブジェクトのCloseメソッドまたはDisposeメソッドを使用するか、C#のusingステートメントまたはVisualBasicのUsingステートメント内のすべての接続を開きます。明示的に閉じられていない接続は、プールに追加または戻されない場合があります。

于 2012-07-02T19:13:17.217 に答える
0

私はそれを自分で解決することができました。

接続文字列に "Pooling = true" と明示的に指定する必要がありました (そして、ゼロ以外の "Min Pool Size" を追加する) 必要がありました。その後、一貫して機能していました。これが設定されていない場合、実際には期待どおりに機能することがありますが、ほとんどの場合は機能しません。

さまざまなユーザー アカウントでもテストしました (ユーザー名/パスワードによる SQL Server 認証と「統合セキュリティ = SSPI」)。"Pooling = true" を設定している限り、どちらのアプローチも WCF サービスで機能します。

これが私のインストール/SQL Serverバージョン/ADO.NETバージョンのみの問題である場合、データはありませんが、解決するのにかなりの時間がかかりました.

于 2012-07-03T16:06:27.160 に答える