Question

J'ai créé une classe singleton, cette classe renvoie une connexion à une base de données. Donc, ma question est-ce que cette connexion satisfait également aux critères de singleton?
Si non, comment puis-je le rendre singleton.
Voici le code.

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;
    }
}
Était-ce utile?

La solution

Votre Singleton est toujours éteint.

En ce qui concerne le motif singleton, veuillez vous reporter à la description détaillée de Jon Skeet ici: http://www.yoda.arachsys.com/csharp/singleton.html

Utiliser un Singleton pour un objet SqlConnection est une très très mauvaise idée. Il n'y a aucune raison de le faire.

Si vous tentez d'éviter un impact sur les performances de "new SqlConnection ()" ou "connection.Open ()" Sachez qu’il n’ya vraiment aucune performance à cet endroit en raison de la mise en commun des connexions en coulisse. Le regroupement de connexions gère l'ouverture / la fermeture des connexions coûteuses . Pas l'objet SqlConnection.

Vous ne pourrez pas ouvrir simultanément SqlDataReaders / Commands avec la connexion et vous rencontrerez des problèmes de blocage de thread si vous essayez de partager le même objet de connexion avec plusieurs threads.

Le motif Singleton est le motif le plus utilisé et le plus mal utilisé, et il existe de nombreux effets secondaires du singleton que vous ignorez peut-être. Très bonne discussion sur les dangers des singletons ici http://www.youtube.com/watch?v = -FRm3VPhseI

Autres conseils

En .NET C #, vous pouvez écrire votre singleton comme ceci

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

ou pour un environnement multithread:

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 connexion elle-même ne satisfait pas les critères Singleton, car vous pouvez créer plusieurs instances d'un objet de connexion à une base de données. Un singleton, par définition, ne peut être instancié qu'une seule fois.

Vous pouvez faire de la SqlConnection une partie du Singleton, en modifiant votre exemple comme suit:

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 cette manière, la SqlConnection utilisée par votre classe SingletonDB aurait une et une seule SqlConnection, donc suivrait le modèle Singleton.

S'il n'y a pas d'autre moyen d'établir une connexion avec la base de données et si cet attribut ne peut pas être écrasé, je dirais que oui. Si c'est ce que vous faites, vous allez probablement trop loin dans le singleton. Que se passe-t-il si la base de données tombe en panne temporairement et que votre application perd sa connexion? Vous devrez ensuite redémarrer votre application pour pouvoir utiliser à nouveau la base de données.

Je pense que je ne peux pas répondre à cette question sans voir du code. Si vous dites que votre application ne comportera qu'une seule instance de connexion à la base de données, cela pourrait fonctionner si vous pouvez garantir que votre application ne s'exécutera que sur un seul thread (ou du moins toutes les opérations utilisant la connexion à la base de données), car vous pouvez Autant que je sache, exécutez plusieurs opérations en parallèle sur la même connexion.

Par ailleurs, si cela signifie que votre application maintiendra la connexion ouverte entre deux utilisations, je vous le déconseille. Les connexions à la base de données sont des ressources limitées sur le serveur de base de données. Par conséquent, ne les ouvrez que lorsque vous en avez besoin, puis fermez-les.

Singleton signifie que la classe que vous avez créée ne peut être instanciée qu’une seule fois. Donc, si vous voulez que cela se produise, faites deux choses:

  1. Faites en sorte que le constructeur soit privé (afin d'empêcher les autres classes d'y accéder).
  2. instanciez la classe en tant que:

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top