5

サーバー上で実行されている IIS でホストされている WCF サービスがあります。このサービスは、別のサーバーで実行されている SQL Server インスタンスに接続します。このコードでは、リクエストごとに接続を開いたり閉じたりします。WCF サービスは、データベースに対して毎分複数の要求を行います。

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()

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

私の質問は次のとおりです。何が原因で、アプリが SQL の再起動から回復できるようにするにはどうすればよいですか?

PS: 私の開発ボックス (IIS も実行中) で、同じテストを実行すると、同じエラーが数回発生し (データベースのロードが開始されていると思われます)、その後、再び動作を開始します。

4

1 に答える 1

1

プールから取得した接続が新しいものである場合(および接続の試行が成功する場合)もあれば、接続が再利用されて接続の試行が失敗する場合もあります。プール担当者が状態を検出してそのような接続をプールから削除する場合としない場合があるため、切断されたすべての接続が実際に再利用されるわけではありません。

ここから

消失したサーバーへの接続が存在する場合、接続プール担当者が切断された接続を検出せず、無効としてマークした場合でも、この接続がプールから引き出される可能性があります。これが発生すると、例外が生成されます。ただし、接続を解放してプールに戻すには、接続を閉じる必要があります。

接続を作成することが非常にまれで、パフォーマンスに影響がない場合は、プーリングをオフにすることをお勧めします。接続文字列でに設定Poolingするだけです。no

于 2012-05-16T22:07:50.180 に答える