none
SQL Server への大量データ検索時に、Connection をすばやく Close する方法 RRS feed

  • 質問

  • 大量のデータ件数をもったテーブルを検索するツールを作成しています。
    ツールの使用上、全件検索もできてしまい、大量のデータが返ってくる場合があるのですが、
    その際に、途中でキャンセルを行えるようにし、SQL Serverとの接続も正しく切断したいです。

    しかし、データ取得途中でSQL Server との コネクションを切断しようとすると
    切断処理で非常に長い間待たされます。
    すばやく切断する方法はないでしょうか?

    現在の処理の概要です。

    sqlCon.Open();
    SqlDataReader sqlDtrdr = sqlCmd.ExecuteReader();    ← 大量の件数が返るクエリを指定
    While (sqlDtrdr.Read())
    {
       if(キャンセルの場合){
       sqlDtrdr.Close();      ←1.   ここでも時間がかかる
          sqlCon.Close();     ←2.   1の処理をコメントアウトした場合、ここでも時間がかかる
       }
    }

    今は、しょうがないので、SQL Server へのコネクションをクローズせずに
    処理を終了していますが、何度もこの検索処理とキャンセルを繰り返すと、
    SQL Server の接続枠が無くなり、接続自体できなくなります。

    何か、いい方法はありませんでしょうか。
    よろしくお願いいたします。






    2009年10月29日 13:58

回答

  • そういうときはMSDNドキュメントを参照してみてはどうでしょうか?
    SqlDataReader.Close() にはこうあります。
    関連付けられた SqlCommand オブジェクトの Cancel メソッドを呼び出してから Close メソッドを呼び出すと、SqlDataReader を閉じる時間を短縮できます。
    2009年10月29日 14:49
  • 私なら検索処理を別スレッドにしておき、Close処理をUIとは非同期に実行するかな。
    甕星
    2009年10月29日 14:46
  • 少し気になりましたので話が逸れるかもしれませんが、大量のデータを検索してしまってキャンセルするのではなく、そのような状態を発生させないようにすることができないかを検討することも大事だと思います。
    大量のデータが返ってくる場合は人間にとって実質的に検索になっていません。ある一定数以上の検索結果になったのであれば検索条件を変えてもっと絞り込んでもらうようにメッセージを出すのも一つの方法です。また、検索結果の上位何件かを表示することもあります。例えば直近の売上を見たい場合はこの方法で十分でしょう。それでも大量の検索結果を見たい場合には、ネットの検索サイトの結果のようにページングを行うことも考えられます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年10月29日 15:41
    モデレータ

すべての返信

  • 私なら検索処理を別スレッドにしておき、Close処理をUIとは非同期に実行するかな。
    甕星
    2009年10月29日 14:46
  • そういうときはMSDNドキュメントを参照してみてはどうでしょうか?
    SqlDataReader.Close() にはこうあります。
    関連付けられた SqlCommand オブジェクトの Cancel メソッドを呼び出してから Close メソッドを呼び出すと、SqlDataReader を閉じる時間を短縮できます。
    2009年10月29日 14:49
  • 少し気になりましたので話が逸れるかもしれませんが、大量のデータを検索してしまってキャンセルするのではなく、そのような状態を発生させないようにすることができないかを検討することも大事だと思います。
    大量のデータが返ってくる場合は人間にとって実質的に検索になっていません。ある一定数以上の検索結果になったのであれば検索条件を変えてもっと絞り込んでもらうようにメッセージを出すのも一つの方法です。また、検索結果の上位何件かを表示することもあります。例えば直近の売上を見たい場合はこの方法で十分でしょう。それでも大量の検索結果を見たい場合には、ネットの検索サイトの結果のようにページングを行うことも考えられます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年10月29日 15:41
    モデレータ
  • フォーラムオペレーターの高橋春樹です。

    甕星さん、佐祐理さん、trapemiyaさん、こんにちは。
    アドバイスありがとうございました。

    ペレイラさん、初めまして。
    MSDNフォーラムのご利用ありがとうございます。

    皆様からアドバイスを頂いたと思うのですが、試して頂けたでしょうか?
    trapemiyaさんのアドバイスにあるように、検索条件の絞り込みも、是非考慮してみてください。
    もし良ければ、試した結果を報告して頂けると、皆様の良い参考となるので助かります。

    今回、甕星さん、佐祐理さん、trapemiyaさんからの投稿が、有用な情報だと思いましたので、
    勝手ながら、回答マークを付けさせて貰いました。

    今後ともMSDNフォーラムを宜しくお願いします(^_^)


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年11月12日 6:43