ottenere la connessione db attraverso la class singleton

Ho creato una class singleton, questa class 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.

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

Il tuo Singleton è ancora spento.

Per quanto riguarda il modello singleton, si prega di consultare la descrizione molto buona e dettagliata di Jon Skeet qui: http://www.yoda.arachsys.com/csharp/singleton.html

L’utilizzo di Singleton per un object SqlConnection è un’idea davvero pessima. Non vi è alcun motivo per fare tutto questo.

Se si sta tentando di evitare un impatto in termini di prestazioni di “nuovo SqlConnection ()” o “connection.Open ()”, si consiglia di non notare alcun risultato in termini di prestazioni a causa del pool di connessioni in corso dietro le quinte. Connection Pooling gestisce l’apertura / chiusura delle costose connessioni. Non l’object SqlConnection.

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

Il pattern Singleton è il modello più usato 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

La connessione stessa non soddisfa i criteri di Singleton perché è ansible creare più istanze di un object di connessione al database. Un singleton per definizione può essere istanziato solo una volta.

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

 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 il SqlConnection utilizzato dalla class SingletonDB avrebbe uno e solo un SqlConnection, quindi seguirà il pattern Singleton.

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

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

o per l’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; } } } 

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.

Non posso rispondere a questa domanda senza vedere un codice, penso. 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.

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

  1. Rendi privato il costruttore. (Ciò per impedire ad altre classi di accedervi).
  2. istanziare la class come:

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