2009-05-02 39 views
12

He creado 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.obteniendo conexión db a través de la clase 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

código actualizado, ahora comentarios sobre el nuevo código – Sharique

+0

han pensado en la inyección de la dependencia de SQLConnection a su clase Singleton? –

Respuesta

23

Su Singleton todavía está apagado.

Por lo que el patrón Singleton va, por favor ver muy buena y detallada descripción de Jon Skeet aquí: http://www.yoda.arachsys.com/csharp/singleton.html

El uso de un Singleton para un objeto SqlConnection es una muy, muy 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 debido a la agrupación de conexiones que se produce detrás de las escenas. Connection Pooling maneja la apertura/cierre de 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 bloqueo de subprocesos si está intentando compartir el mismo objeto de conexión con varios subprocesos.

El patrón 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

+0

Toda mi vida he sido truco con no hacer una conexión en cada llamada porque "es matar el rendimiento de la aplicación". – BlaShadow

+0

Un enlace a [artículo actualizado de Jon Skeet] (http://csharpindepth.com/Articles/General/Singleton.aspx) sobre el patrón de singleton puede ser útil. – Corio

1

Si no hay otra manera de obtener una conexión a la base de datos, 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.

1

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, desaconsejaría. 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.

4

La conexión en sí no cumple 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.

Usted puede hacer el SqlConnection una parte del Singleton, cambiando ejemplo para esto:

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 manera el SqlConnection utilizado por la clase SingletonDB tendría único una SqlConnection, por lo tanto, siga el patrón de Singleton.

+0

He cambiado el código, mira ahora. – Sharique

1

Singleton significa que la clase que ha creado se puede crear una instancia solo una vez. Así que si quieres que esto suceda, hacer dos cosas:.

  1. Hacer el constructor privado (Esto es para evitar que otras clases de acceder a él.)
  2. una instancia de la clase como:

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

En .NET C# se puede wrtie su producto único como este

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

o por múltiples entorno de roscado:

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

Consulte esta página de MSDN para obtener más información: https://msdn.microsoft.com/en-us/library/ff650316.aspx –

Cuestiones relacionadas