QA@IT

[.NET4 C#]SqlConnectionをnewするとハンドルリークする

7909 PV

.NET4、C#、Windows Formアプリケーションです。

        private void Form1_Load(object sender, EventArgs e)
        {
            using (SqlConnection cnn = new SqlConnection())
            {
            }
        }

上記のコードを書いて実行し、そのまま放置しておくと、10~20分後くらいからハンドル数が増え始めます。
ある程度増えるとガベージコレクションが働くのか、ハンドル数が一気に減ります。
問題があるかないかで言えばないのかもしれませんが、気持ち悪いです。
対処法がないか探しています。
よろしくお願いいたします。

回答

ご回答ありがとうございます。

「SqlConnectionをnewする」ことが、「10~20分後くらいからハンドル数が増え始めます」の直接の原因であることは確認済ですか?

確認済みです。

また、それがハンドルリークだと判断した根拠はなんでしょう?

パフォーマンスモニターで当該プロセスのHandle Countをモニタリングし、増加し続けることを確認しました。

「リーク」ではないような気がします。

おっしゃる通りで、解放される以上、正確には「リーク」ではないかもしれません。

質問者さんのケースではそういう状況には至ってない、すなわち「リーク」ではなくて正常な動きの範囲という気がします。

解放まで考えると正常な動きかもしれませんが、上記のコードを書いただけでハンドルが増えていくこと自体は正常ではない気がします。

編集 履歴 (0)
  • 質問者さんは回答欄に返事を書くのではなく、回答者の回答のコメント欄に返事を書くようお願いします。ここではそういうのがルールのようですので、質問者さんが回答欄に書かれると、何が何だか分からなくなってきます。 -
  • アドバイスありがとうございます。
    今後そのように致します。
    -
  • 自分でもやってみましたが確かに起動直後は 300 程度だったのが 30 分後には倍に増加しました。しかしながら、自動的に解放されるということは、それはやはり「リーク」ではないですね。正常な動きの範囲と思います。 -
  • 検証して頂いてありがとうございます。
    正常な動きの範囲ということで承知致しました。
    (でも、何もしていないのにハンドルが増加するのがどうしても腑に落ちません。。。)
    -

Form1のLoadイベントに記述されていますがForm1のインスタンス作成から破棄まではどのように
行っていますか?

そのまま放置と書いてありますがFormを表示後何の操作も
されていないのでしょうか?

LoadイベントはShowDialogしたインスタンスを再利用した場合、
再度ShowDialogされたときにも発生しますのでそのあたりは関係ないでしょうか?

編集 履歴 (0)
  • ご回答ありがとうございます。
    Visual Studio 2010でWindowsフォームアプリケーションのプロジェクトを新規作成し、最初からあるForm1に上記のコードを書いただけです。
    したがって、インスタンス作成はProgram.csのMain()内で行い、明示的な破棄は行っていません。
    また、Formを表示後何の操作もしていません。
    -

「SqlConnectionをnewする」ことが、「10~20分後くらいからハンドル数が増え始めます」の直接の原因であることは確認済ですか? (new するコードが無い場合は増えることはないのを確認するなどして)

また、それがハンドルリークだと判断した根拠はなんでしょう? 以下の記事に書いてあるようなことを行った結果ということでしょうか?

ハンドルリークの調査方法 ~ ハンドルリークとは?
http://keicode.com/iis/iis504.php

でも、

ある程度増えるとガベージコレクションが働くのか、ハンドル数が一気に減ります。

ということですと「リーク」ではないような気がします。

上に紹介した記事に、

"逆に閉じるのを忘れてしまうと、いつまでもリソースが残ります。この状態がハンドルリークです。 つまりハンドルリークとはハンドルの閉じ忘れにより、プロセス内に無駄なリソースが蓄積された状態になることです。 逆に閉じるのを忘れてしまうと、いつまでもリソースが残ります。この状態がハンドルリークです。 つまりハンドルリークとはハンドルの閉じ忘れにより、プロセス内に無駄なリソースが蓄積された状態になることです"

と書いてありますが、質問者さんのケースではそういう状況には至ってない、すなわち「リーク」ではなくて正常な動きの範囲という気がします。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。