Domanda

Ho creato una classe singleton, questa classe restituisce una connessione al database. Quindi la mia domanda è che questa connessione soddisfa anche i criteri singleton?
Se no, di come posso renderlo singleton.
Ecco il codice.

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;
    }
}
È stato utile?

Soluzione

Il tuo Singleton è ancora spento.

Per quanto riguarda il modello singleton, si prega di vedere qui l'ottima e dettagliata descrizione di Jon Skeet qui: http://www.yoda.arachsys.com/csharp/singleton.html

L'uso di un Singleton per un oggetto SqlConnection è una pessima idea. Non c'è motivo di farlo in alcun modo.

Se stai tentando di evitare un calo delle prestazioni di " new SqlConnection () " o " connection.Open () " si informa che non vi è alcun impatto sulle prestazioni a causa del pool di connessioni in corso dietro le quinte. Il pool di connessioni gestisce l'apertura / chiusura delle connessioni economiche . Non l'oggetto SqlConnection.

Non sarai in grado di aprire contemporaneamente più SqlDataReaders / Comandi con la connessione e incorrerai in problemi di blocco dei thread se stai provando a condividere lo stesso oggetto di connessione con più thread.

Il modello Singleton è il modello più utilizzato e abusato e ci sono molti effetti collaterali del singleton di cui potresti non essere a conoscenza. Ottimi discorsi sui pericoli dei single qui http://www.youtube.com/watch?v = -FRm3VPhseI

Altri suggerimenti

In .NET C # puoi scrivere il tuo singleton in questo modo

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

o per ambiente multi thread:

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

La connessione stessa non soddisfa i criteri Singleton poiché è possibile creare più istanze di un oggetto connessione al database. Un singleton per definizione può essere istanziato una sola volta.

Puoi puoi rendere SqlConnection una parte di Singleton, cambiando il tuo esempio in questo:

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

}

In questo modo la SqlConnection usata dalla tua classe SingletonDB avrebbe una e una sola SqlConnection, quindi segui il modello Singleton.

Se non c'è altro modo per ottenere una connessione al DB e se questo attributo non può essere sovrascritto, direi di sì. Se è quello che stai facendo, probabilmente stai portando questa cosa singleton troppo lontano. Cosa succede se il DB si arresta temporaneamente e l'app perde la connessione? Quindi dovrai riavviare l'app per poter riutilizzare il DB.

Non posso rispondere a questa domanda senza vedere del codice, credo. Se stai dicendo che avrai solo un'istanza di connessione DB nella tua applicazione, ciò potrebbe funzionare se puoi garantire che l'applicazione verrà eseguita su un solo thread (o almeno che tutte le operazioni che utilizzano la connessione DB lo fanno), dal momento che puoi (per quanto ne so in ogni caso) eseguono diverse operazioni in parallelo sulla stessa connessione.

Inoltre, se ciò significa che l'applicazione manterrà la connessione aperta tra un utilizzo e l'altro, la sconsiglierei. Le connessioni DB sono risorse limitate sul server DB, quindi è necessario tenerle aperte solo quando sono necessarie, quindi chiuderle.

Singleton significa che la classe che hai creato può essere istanziata una sola volta. Quindi, se vuoi che ciò accada, fai due cose:

  1. Rendi privato il costruttore (questo per impedire ad altre classi di accedervi).
  2. crea un'istanza della classe come:

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top