2012-05-16 17 views
5

IISでホストされ、サーバー上で実行されているWCFサービスがあります。このサービスは、別のサーバーで実行されているSQL Serverインスタンスに接続します。コードでは、リクエストごとに接続を開いたり閉じたりします。 WCFサービスは、1分間に複数の要求をデータベースに送信します。SqlClientが無効な接続を再利用する原因は何ですか?

WCFサービスを停止せずにSQLサービスを再起動すると、WCFサービスはエラーログにエラーログを記録しますが、これは完全に正常です。

問題は、SQLサービスを再起動した後に、時には(常にではない)、WCFサービスはリクエストごとにレポートにこのエラーを続けていることである:

Cannot open database "mydatabase" requested by the login. The login failed." 

エラーのスタックトレースで終了します。

at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 

この間、私はSQL Management Studio(WCFサービスを実行しているマシンと同じマシン)を使用してデータベースに接続できました。問題を解決するには、WCFサービスのアプリケーションプールをリサイクルする必要があります。

私の質問は:これは何が原因で、私のアプリがSQLの再起動から回復できるようにするために何ができるのですか?

P.S .:同じテストを行うと、同じエラーが数回発生します(データベースのロードが開始されていると思いますが)。

+0

SqlExceptionをキャッチして、特定のエラーコードを確認してから、SqlConnection.ClearPool(sqlConnection)を呼び出すと便利です。もう一度文を再試行してください – Termit

答えて

1

プールから取得した接続が新しい場合(接続が成功した場合)、接続が再利用されて接続が失敗することがあります。プールされた接続は、実際に再利用されるわけではありません。なぜなら、プーラーは条件を検出したり検出したりしないため、プールからそのような接続を削除する可能性があるからです。

From here

接続が消えているサーバーに存在する場合、この接続はプールから描画するために、それが接続プーラーが切断された接続を検出したとして、それをマークしていなくても可能です無効。これが発生すると、例外が生成されます。ただし、接続をプールに戻すには、接続を閉じておく必要があります。

パフォーマンスの低下がほとんどないように接続を作成する場合は、プーリングをオフにすることをお勧めします。接続文字列にPoolingnoと設定してください。

関連する問題