obtener conexión db a través de la clase singleton

Creé una clase singleton, esta clase devuelve una conexión de base de datos. ¿Entonces mi pregunta es que esta conexión también satisface los criterios únicos?
Si no, entonces, ¿cómo puedo hacerlo único?
Aquí está el código.

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

Su Singleton todavía está apagado.

En lo que respecta al patrón singleton, consulte la muy buena y detallada descripción de Jon Skeet aquí: http://www.yoda.arachsys.com/csharp/singleton.html

Usar un Singleton para un objeto SqlConnection es realmente una mala idea. No hay razón para hacer esto en absoluto.

Si intenta evitar un golpe de rendimiento de “new SqlConnection ()” o “connection.Open ()”, tenga en cuenta que realmente no hay ningún rendimiento alcanzado allí debido a la agrupación de conexiones que se produce detrás de las escenas. Connection Pooling maneja la apertura / cierre de las costosas conexiones. No es el objeto SqlConnection.

No podrá abrir múltiples SqlDataReaders / Commands con la conexión al mismo tiempo y se encontrará con problemas de locking de subprocesos si está intentando compartir el mismo objeto de conexión con varios subprocesos.

El patrón de Singleton es el patrón más utilizado y abusado y hay muchos efectos secundarios del singleton que puede que no tenga en cuenta. Muy buena charla sobre los peligros de los singleton aquí http://www.youtube.com/watch?v=-FRm3VPhseI

La conexión en sí no satisface los criterios de Singleton porque puede crear varias instancias de un objeto de conexión de base de datos. Un singleton por definición solo se puede instanciar una vez.

Puede hacer que SqlConnection forme parte de Singleton, cambiando su ejemplo a este:

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

}

De esta forma, la SqlConnection utilizada por su clase SingletonDB tendría una y solo una SqlConnection, por lo tanto, siga el patrón de Singleton.

En .NET C # puede grabar su singleton como este

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

o para el entorno de múltiples hilos:

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

Si no hay otra manera de obtener una conexión con el DB, y si este atributo no se puede sobrescribir, yo diría que sí. Si eso es lo que estás haciendo, probablemente te estés tomando demasiado en serio. ¿Qué sucede si el DB se desactiva temporalmente y tu aplicación pierde su conexión? Luego tendrá que reiniciar su aplicación para que pueda volver a utilizar la base de datos.

No puedo responder esa pregunta sin ver un código, creo. Si está diciendo que solo tendrá una instancia de conexión de base de datos en su aplicación, eso podría funcionar si puede garantizar que su aplicación se ejecutará en un solo hilo (o al menos que todas las operaciones que utilizan la conexión de base de datos lo hagan), ya que puede ‘t (hasta donde sé de todos modos) ejecutar varias operaciones en paralelo en la misma conexión.

Además, si esto significa que su aplicación mantendrá la conexión abierta entre usos, le aconsejaría que no la use. Las conexiones de base de datos son recursos limitados en el servidor de bases de datos, por lo que debe mantenerlas abiertas solo cuando las necesite y luego cerrarlas.

Singleton significa que la clase que ha creado se puede crear una instancia solo una vez. Entonces, si quieres que eso suceda, haz dos cosas:

  1. Haga que el constructor sea privado. (Esto es para evitar que otras clases accedan a él).
  2. instanciar la clase como:

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