2012-02-23 15 views
1

解決できない問題があります。私の開発チームは、単体テストデータベースに対して実行するC#単体テストのスイートを持っています。各テストの前に、ベースラインの開始点にデータベースを復元する必要があります。これを達成する最速の方法は次のとおりです。SQL Serverデータベースを接続した後断続的な接続エラーが発生する

  1. データベースを切り離します。
  2. .mdfファイルと.ldfファイルをベースラインのバックアップコピーで上書きします。
  3. データベースを接続します。

これらのアクションは、C#からTransact SQLコマンドを呼び出して実行します。

私の問題は、ユニットテストデータベースへの接続を開く時間の約50%が例外であることです。例外はさまざまなタイプですが、データベースが存在しないことを示唆しているようです。 Attachステートメントの後に「スリープ」コマンドを置くと、毎回データベースを正常に開くことができます。私の解釈は、データベースをオンラインにするためにデータベースに対して実行する何らかの種類のSQL Serverバックグラウンドプロセスがなければならないということです。したがって、sp_attach_dbを実行した直後に、データベースは実際には数ミリ秒後まで使用できる状態にありません。

もちろん、私の解決策は、すべてのデータベースが接続された後に「スリープ」ステートメントを実行することですが、これらのテストが800件あるため、デタッチ/リストア/アタッチプロセスはできるだけ高速です。

誰でもこの問題が発生しましたか?誰でもデータベースがすぐに接続を受け入れることができない理由を知っていますか?誰でもデータベースが接続を受け入れる準備ができていることをどのように検出できるか知っていますか?

ありがとうございます。

+0

実際のデータベースの代わりにメモリデータベースを使用することを考えましたか? H2Sharpはそれらの1つです –

+0

@ StigHausberg。単体テストの目的で、SQL Serverから別のデータベースにデータベースを移動するのは簡単です:)私たちが実際に行ったことは、mdfとldfファイルをRAMドライブに格納することです。 – Kev

+0

単体テストを実行するたびに「古い/修正された」データベースを復元していれば分かりますか? 「SQL Serverから別のデータベースへのデータベースの移動」は、これを完全に不要にするものです。あなたが話しているこのベースラインの開始点は、XMLファイルに保存し、H2Sharpとしてインメモリデータベースによってテストを実行するために使用できます。 –

答えて

1

接続のプーリングをオフにしてみます。プーリングがONの場合、DBを切り離している間に強制的にクローズするとプール内の接続が切断され、接続プールから接続が来たときに最初のバッチが失敗します。

単にあなたの接続文字列にPooling=no

PS追加:あなたのテストはそれほど複雑な場合は、トランザクション内でテストを実行するために、はるかに高速にすることができ、それがDB

をクリアするために完了したときに、単にそれをロールバックします
+0

ありがとうオレグ。あなたがその答えを投稿したとき、私は自分の答えを同時に投稿していました。 私の解釈は間違っていました。実際の問題は、いったんデータベースを接続すると、接続プール内のすべての接続が無効になったということでした。 私の解決策は、SqlConnection.ClearAllPools()を使用してデータベースを接続した後に接続プールをクリアすることでした。 オレグ、あなたの解決策が事実上同じものだったので、私はあなたに答えを与えるでしょう。 ところで、トランザクション内でのラッピングはより良いアプローチですが、多くのテストはそれを行うにはあまりにも複雑です。 – Kev

関連する問題