2009-05-02 9 views
12

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

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

codice aggiornato, ora commentare nuovo codice – Sharique

+0

avete pensato di iniettare la dipendenza SQLConnection alla classe Singleton? –

risposta

23

tuo Singleton è ancora spento.

Per quanto riguarda il pattern Singleton va, si prega di vedere molto buona e dettagliata descrizione di Jon Skeet qui: http://www.yoda.arachsys.com/csharp/singleton.html

Utilizzando un Singleton per un oggetto SqlConnection è un davvero, davvero pessima idea. Non vi è alcun motivo per fare tutto questo.

Se si sta tentando di evitare un calo di prestazioni di "new SqlConnection()" o "connection.Open()" essere avvertito che non c'è davvero alcun calo di prestazioni a causa della pool di connessioni in corso dietro le quinte. Connection Pooling gestisce l'apertura/chiusura delle costosi connessioni. Non l'oggetto SqlConnection.

Non sarà possibile aprire più SqlDataReaders/Commands con la connessione contemporaneamente e si verificheranno problemi di blocco dei thread se si sta tentando di condividere lo stesso oggetto di connessione con più thread.

Il pattern Singleton è il pattern più utilizzato e abusato e ci sono molti effetti collaterali del singleton che potresti non essere a conoscenza.Molto bene parlare dei pericoli dei singleton qui http://www.youtube.com/watch?v=-FRm3VPhseI

+0

Per tutta la vita sono stato inganno con non creare una connessione per ogni chiamata perché "uccide le prestazioni dell'applicazione". – BlaShadow

+0

Un collegamento a [articolo di Jon Skeet aggiornato] (http://csharpindepth.com/Articles/General/Singleton.aspx) su modello singleton può tornare utile. – Corio

1

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

1

non posso rispondere a questa domanda senza vedere un po 'di codice, credo. Se stai dicendo che avrai una sola istanza di connessione DB nella tua applicazione, potrebbe funzionare se puoi garantire che la tua applicazione verrà eseguita su un solo thread (o almeno che tutte le operazioni che utilizzano la connessione DB), dato che puoi 't (per quanto ne so comunque) eseguire diverse operazioni in parallelo sulla stessa connessione.

Inoltre, se ciò significa che l'applicazione manterrà la connessione aperta tra gli usi, vorrei sconsigliarla. Le connessioni DB sono risorse limitate sul server DB, quindi è consigliabile tenerle aperte solo quando sono necessarie e quindi chiuderle.

4

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

È può fare la SqlConnection una parte del Singleton, cambiando il vostro esempio a 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 lo SqlConnection utilizzato dalla classe SingletonDB avrebbe solo ed unico una SqlConnection, quindi seguire lo schema Singleton.

+0

Ho cambiato codice, controlla ora. – Sharique

1

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

  1. Fai il privato costruttore (Questo per evitare che altre classi di accedervi.)
  2. creare 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; 
    } 
    
4

In .NET C# è possibile wrtie tuo Singleton come questo

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

o per il multi threaded ambiente:

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

Vedere questa pagina MSDN per maggiori informazioni: https://msdn.microsoft.com/en-us/library/ff650316.aspx –

Problemi correlati