2

私のアプリケーションは定期的に MyDatabase に接続し、クエリを実行しています。

MyDatabase データベースがまだ存在せず、作成する必要がある場合に対処する必要があります。私が現在行っていることは、最初にマスターデータベースに接続して次のようなものを実行するたびです。

SELECT * FROM sysdatabases WHERE NAME='MyDatabase'

MyDatabase が存在するかどうかを判断します。そうでない場合は、作成して MyDatabase に接続し、クエリを実行します。

master データベースへの個別の接続を開き、毎回クエリを実行する必要はないように思われます (接続がプールされている場合でも)。MyDatabase にすぐに接続できないのはなぜですか? 99% の確率で成功し、クエリを実行できます。失敗する 1% の回数で、MyDatabase が見つからないことを検出し、その時点でそれを作成できますか?

しかし、これを試してみると、問題が発生しました。MyDatabase に接続しようとして存在しない場合、SqlException が発生します。

ログインで要求されたデータベース MyDatabase を開けません。ログインに失敗しました。

罰金。偉大な。SqlException をキャッチしてマスター データベースに移動し、MyDatabase が存在しないことを確認して作成します。

しかし、それを作成した後、MyDatabase に接続しようとすると、すぐに同じエラーが発生します。

ログインで要求されたデータベース MyDatabase を開けません。ログインに失敗しました。

再度接続しようとしているのではなく、キャッシュされた結果を返しているようです。データベースを作成してから 10 秒待ってから接続を試みると、接続は成功します。

私の質問は、このキャッシングが期待されているか (そうだと思います)、さらに重要なことに、この状況に対処するためのベスト プラクティスはありますか? 使用できる SqlConnection API にキャッシュ クリアランスまたはタイムアウト設定があるのではないでしょうか? 独自のタイムアウト遅延を実装できたと思いますが、見逃しているより良い方法がないことを知りたいです。

4

1 に答える 1

4

私はまったく同じ問題を抱えていました。

SqlConnection.ClearAllPools()新しく作成したデータベースを開こうとする前に静的メソッドを呼び出すと、正常に動作します!

于 2017-01-11T10:21:10.157 に答える