解決できない問題があります。私の開発チームは、単体テストデータベースに対して実行するC#単体テストのスイートを持っています。各テストの前に、ベースラインの開始点にデータベースを復元する必要があります。これを達成する最速の方法は次のとおりです。SQL Serverデータベースを接続した後断続的な接続エラーが発生する
- データベースを切り離します。
- .mdfファイルと.ldfファイルをベースラインのバックアップコピーで上書きします。
- データベースを接続します。
これらのアクションは、C#からTransact SQLコマンドを呼び出して実行します。
私の問題は、ユニットテストデータベースへの接続を開く時間の約50%が例外であることです。例外はさまざまなタイプですが、データベースが存在しないことを示唆しているようです。 Attachステートメントの後に「スリープ」コマンドを置くと、毎回データベースを正常に開くことができます。私の解釈は、データベースをオンラインにするためにデータベースに対して実行する何らかの種類のSQL Serverバックグラウンドプロセスがなければならないということです。したがって、sp_attach_dbを実行した直後に、データベースは実際には数ミリ秒後まで使用できる状態にありません。
もちろん、私の解決策は、すべてのデータベースが接続された後に「スリープ」ステートメントを実行することですが、これらのテストが800件あるため、デタッチ/リストア/アタッチプロセスはできるだけ高速です。
誰でもこの問題が発生しましたか?誰でもデータベースがすぐに接続を受け入れることができない理由を知っていますか?誰でもデータベースが接続を受け入れる準備ができていることをどのように検出できるか知っていますか?
ありがとうございます。
実際のデータベースの代わりにメモリデータベースを使用することを考えましたか? H2Sharpはそれらの1つです –
@ StigHausberg。単体テストの目的で、SQL Serverから別のデータベースにデータベースを移動するのは簡単です:)私たちが実際に行ったことは、mdfとldfファイルをRAMドライブに格納することです。 – Kev
単体テストを実行するたびに「古い/修正された」データベースを復元していれば分かりますか? 「SQL Serverから別のデータベースへのデータベースの移動」は、これを完全に不要にするものです。あなたが話しているこのベースラインの開始点は、XMLファイルに保存し、H2Sharpとしてインメモリデータベースによってテストを実行するために使用できます。 –