Frage

Ich habe eine Singleton-Klasse erstellt, diese Klasse gibt eine Datenbankverbindung. Also meine Frage ist diese Verbindung auch befriedigend ist Singleton Kriterien?
Wenn nein, als wie kann ich es Singleton machen.
Hier ist der Code.

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;
    }
}
War es hilfreich?

Lösung

Ihre Singleton ist nach wie vor aus.

Was die Singletonmuster geht, sehen Sie bitte Jon Skeet sehr gute und detaillierte Beschreibung hier: http://www.yoda.arachsys.com/csharp/singleton.html

einen Singleton für ein SqlConnection-Objekt zu verwenden ist eine wirklich, wirklich schlechte Idee. Es gibt keinen Grund diese auch immer zu tun.

Wenn Sie versuchen, eine Performance-Einbußen von zu vermeiden „new SqlConnection ()“ oder „connection.Open ()“ darauf hingewiesen werden, dass es wirklich keine Leistung gibt es getroffen, weil das Connection-Pooling hinter den Kulissen. Connection Pooling behandelt das Öffnen / Schließen der teuer Verbindungen. Nicht das SqlConnection-Objekt.

Sie werden nicht mehrere SqlDataReaders zu öffnen Lage sein / Befehle mit der Verbindung zur gleichen Zeit und in Thread Blockierungsprobleme ausgeführt werden, wenn Sie versuchen, die gleiche Verbindungsobjekt mit mehreren Threads zu teilen.

Das Singleton-Muster ist das Muster über gebraucht und missbraucht, und es gibt viele Nebenwirkungen des Singletons, die Sie möglicherweise nicht bewusst sein können. Sehr gutes Gespräch über die Gefahren von Singletons hier http://www.youtube.com/watch?v = -FRm3VPhseI

Andere Tipps

In .NET C # Sie Ihre Singletons wie diese wrtie kann

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

oder multi-threaded Umgebung:

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;
      }
   }
}

Die Verbindung selbst ist nicht die Erfüllung der Kriterien Singleton, weil Sie mehrere Instanzen einer Datenbank-Verbindungsobjekt erstellen können. Ein Singleton per Definition kann nur einmal instanziiert werden.

Sie können machen die SqlConnection einen Teil des Singleton, von Ihrem Beispiel diese zu ändern:

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;
   }

}

Auf diese Weise die SqlConnection von Ihrem SingletonDB Klasse verwendet man haben würde und nur eine SqlConnection, so dass die Singleton-Muster folgen.

Wenn es keine andere Möglichkeit, eine Verbindung mit dem DB zu bekommen, und wenn dieses Attribut nicht überschrieben werden kann, würde ich sagen, ja. Wenn das, was du tust, bist du wahrscheinlich diese Singleton Sache nehmen zu weit. Was passiert, wenn die die DB geht vorübergehend und Ihre Anwendung verliert seine Verbindung? Dann werden Sie haben Ihre Anwendung neu starten, um für sie in der Lage sein, wieder die DB zu verwenden.

Ich kann diese Frage nicht beantworten, ohne irgendeinen Code zu sehen, denke ich. Wenn Sie sagen, dass Sie nur eine DB-Verbindung Instanz in Ihrer Anwendung haben wird, arbeiten das könnte, wenn Sie garantieren können, dass Ihre Anwendung auf nur ein Thread ausgeführt wird (oder zumindest, dass alle Operationen der DB-Verbindung der Fall ist), da können Sie ‚t (soweit ich weiß sowieso) mehrere Operationen in parallell auf derselben Verbindung ausgeführt werden.

Auch wenn es bedeutet, dass Ihre Anwendung wird die Verbindung offen hält zwischen den Anwendungen, würde ich davon abraten. DB-Verbindungen sind begrenzte Ressourcen auf dem DB-Server, so dass Sie sollten sie nur öffnen halten, wenn sie benötigt werden, und schließen Sie sie dann.

Singleton bedeutet, dass die Klasse, die Sie gemacht haben, kann nur einmal instanziiert werden. Wenn Sie also das geschehen soll, zwei Dinge tun:

  1. Stellen Sie den Konstruktor privat. (Dies ist andere Klassen zu verhindern, dass es erreichbar.)
  2. die Klasse instanziiert wie:

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top