2

重複の可能性:
SqlConnectionシングルトン

これは現在のコードです:

static SqlConnection CreateConnection() {
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
    return conn;
}

アプリケーションに必要なオープン接続は1つだけなので、このデザインパターンに移行したいと思います。上記を以下に変換するにはどうすればよいですか?

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 

私はJonSkeetのサイトからこのパターンを選んだばかりです-それが最良の選択のように聞こえたので完全に怠惰なバージョンを選びました-しかし正しいものではないかもしれません。

4

2 に答える 2

3

シングルトンパターンが採用された状況はほとんどありません。クラスインスタンスのインスタンスが1つだけ必須である必要があることを確認する必要があります。通常、この設計要件はありませんが、人々はそれを補う傾向があります。

作業単位が完了したらすぐに接続を解放する必要があります。接続を永久に開いたままにしないでください。接続をシングルトンに変換しても、アプリケーションの設計を改善するのに役立ちません。

接続プーリングメカニズムは複雑さを管理するため、これは設計によって最適化されているため、接続のオープンとクローズに関連するパフォーマンスについて心配する必要はありません。

データベースサーバーへの接続は、通常、時間のかかるいくつかの手順で構成されます。ソケットや名前付きパイプなどの物理チャネルを確立し、サーバーとの最初のハンドシェイクを実行し、接続文字列情報を解析し、サーバーによって接続を認証し、現在の参加を確認するためにチェックを実行する必要があります。トランザクションなど。

実際には、ほとんどのアプリケーションは、接続に1つまたはいくつかの異なる構成のみを使用します。これは、アプリケーションの実行中に、多くの同一の接続が繰り返し開かれたり閉じられたりすることを意味します。接続を開くコストを最小限に抑えるために、ADO.NETは接続プールと呼ばれる最適化手法を使用します。

接続プーリングにより、新しい接続を開く必要がある回数が減ります。プール担当者は、物理接続の所有権を維持します。指定された接続構成ごとにアクティブな接続のセットを維持することにより、接続を管理します。ユーザーが接続でOpenを呼び出すたびに、プール担当者はプールで使用可能な接続を探します。プールされた接続が使用可能な場合、新しい接続を開く代わりに、それを呼び出し元に返します。アプリケーションが接続でCloseを呼び出すと、プール担当者は接続を閉じるのではなく、プールされたアクティブな接続のセットに返します。接続がプールに戻されると、次のOpen呼び出しで再利用できるようになります。

ソースMSDN

于 2012-09-24T14:51:24.737 に答える
2

問題はそうではありませんsingleton。アプリケーションで1つの開いている接続を維持すると、パフォーマンスが低下し、接続の同時実行性と接続プールが使用されません。

Connections技術的には、次のものと一緒に使用されている限り、開いている数を気にする必要はありませんusing

using (var connection = new SqlConnection("yourConnectionString"))
{}

ADO.NET接続プールが自動的に接続を処理します。

于 2012-09-24T14:52:11.047 に答える