web-dev-qa-db-ja.com

シングルトンクラスを介してデータベース接続を取得する

シングルトンクラスを作成しました。このクラスはデータベース接続を返します。だから私の質問は、この接続もシングルトン基準を満たしているということですか?
いいえの場合、どうすればシングルトンにすることができますか。
これがコードです。

public sealed class SingletonDB
{
    static readonly SingletonDB instance = new SingletonDB();
    static SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString);

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

    SingletonDB()
    {
    }

    public static SingletonDB Instance
    {
        get
        {
            return instance;
        }
    }

    public static SqlConnection GetDBConnection()
    {
        return con;
    }
}
17
Sharique

シングルトンはまだオフです。

シングルトンパターンに関する限り、ここでJon Skeetの非常に優れた詳細な説明を参照してください: http://www.yoda.arachsys.com/csharp/singleton.html

SqlConnectionオブジェクトにシングルトンを使用することは、本当に、本当に悪い考えです。これを行う理由は何もありません。

「newSqlConnection()」または「connection.Open()」のパフォーマンスヒットを回避しようとしている場合は、接続プールがバックグラウンドで実行されているため、実際にはパフォーマンスヒットがないことに注意してください。接続プーリングは、高価な接続の開閉を処理します。 SqlConnectionオブジェクトではありません。

接続で複数のSqlDataReaders /コマンドを同時に開くことはできず、同じ接続オブジェクトを複数のスレッドと共有しようとすると、スレッドブロッキングの問題が発生します。

シングルトンパターンは最も頻繁に使用され、乱用されているパターンであり、あなたが気付いていないかもしれないシングルトンの多くの副作用があります。ここでシングルトンの危険性について非常に良い話 http://www.youtube.com/watch?v=-FRm3VPhseI

29
Chad Grant

.NET C#では、次のようにシングルトンを記述できます。

    public class Singleton{
public static readonly Singleton Instance= new Singleton();
private Singleton(){}

またはマルチスレッド環境の場合:

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
5

データベース接続オブジェクトの複数のインスタンスを作成できるため、接続自体がシングルトン基準を満たしていません。定義上、シングルトンは一度だけインスタンス化できます。

あなたcan例を次のように変更することにより、SqlConnectionをシングルトンの一部にします。

public sealed class SingletonDB
{
   private static readonly SingletonDB instance = new SingletonDB();
   private readonly SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString);

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

   private SingletonDB()
   {
   }

   public static SingletonDB Instance
   {
       get
       {
          return instance;
       }
   }

   public SqlConnection GetDBConnection()
   {
       return con;
   }

}

このように、SingletonDBクラスで使用されるSqlConnectionには1つだけのSqlConnectionがあるため、シングルトンパターンに従います。

4

シングルトンとは、作成したクラスをインスタンス化できるのは1回だけであることを意味します。したがって、それを実現したい場合は、次の2つのことを行います。

  1. コンストラクターをプライベートにします(これは、他のクラスがコンストラクターにアクセスできないようにするためです)。
  2. クラスを次のようにインスタンス化します。

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
2
codeFreak

DBへの接続を取得する他の方法がなく、この属性を上書きできない場合は、「はい」と言います。それがあなたがしていることであるならば、あなたはおそらくこのシングルトンのことをやり過ぎているでしょう。 DBが一時的にダウンし、アプリが接続を失った場合はどうなりますか?次に、アプリがDBを再び使用できるようにするには、アプリを再起動する必要があります。

1
allyourcode

コードを見ないとその質問に答えられないと思います。アプリケーションにDB接続インスタンスが1つしかないという場合、アプリケーションが1つのスレッドだけで実行されること(または少なくともDB接続を使用するすべての操作が実行されること)を保証できれば、それは機能する可能性があります。 (とにかく私が知る限り)同じ接続で複数の操作を並行して実行しません。

また、アプリケーションが使用の合間に接続を開いたままにすることを意味する場合は、使用しないことをお勧めします。 DB接続はDBサーバー上の限られたリソースであるため、必要な場合にのみ開いたままにしてから閉じてください。

1
Fredrik Mörk