Pergunta

Eu criei uma classe singleton, essa classe retorna uma conexão de banco de dados. Então, minha pergunta é esta conexão também está satisfazendo critérios únicos?
Se não, que como eu posso fazer isso Singleton.
Aqui está o 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;
    }
}
Foi útil?

Solução

Seu Singleton ainda está desligado.

Quanto ao padrão Singleton vai, consulte muito bom de Jon Skeet e descrição detalhada aqui: http://www.yoda.arachsys.com/csharp/singleton.html

Usando um Singleton para um objeto SqlConnection é um muito, muito má ideia. Não há nenhuma razão para fazer isso tudo.

Se você está tentando evitar um golpe de performance "new SqlConnection ()" ou "connection.Open ()" esteja ciente de que não há realmente nenhuma desempenho atingido devido à pool de conexão acontecendo nos bastidores. Connection Pooling lida com a abertura / fechamento das caros conexões. Não o objeto SqlConnection.

Você não será capaz de abrir várias SqlDataReaders / Comandos com a conexão ao mesmo tempo e vai correr em questões de rosca de bloqueio, se você está tentando compartilhar o mesmo objeto de conexão com vários segmentos.

O padrão Singleton é o padrão mais sobre usado e abusado e há muitos efeitos colaterais do singleton que você pode não estar ciente. Muito boa conversa sobre os perigos de singletons aqui http://www.youtube.com/watch?v = -FRm3VPhseI

Outras dicas

Em .NET C # você pode wrtie seu singleton como este

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

ou para o ambiente multi threaded:

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

A ligação em si não é de cumprimento dos critérios Singleton, porque você pode criar várias instâncias de um objeto de conexão de banco de dados. A Singleton, por definição, só pode ser instanciado uma vez.

Você pode fazer o SqlConnection uma parte do Singleton, alterando o seu exemplo para isso:

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

}

Desta forma, o SqlConnection usado por sua classe SingletonDB teria uma e apenas uma SqlConnection, siga assim o padrão Singleton.

Se não há outra maneira de obter uma conexão com o DB, e se esse atributo não pode ser substituído, eu diria que sim. Se é isso que você está fazendo, você provavelmente está levando essa coisa Singleton longe demais. E se o DB desce temporariamente e sua aplicação perde sua conexão? Então você terá que reiniciar o aplicativo para que ele seja capaz de usar o DB novamente.

Eu não posso responder a essa pergunta sem ver algum código, eu acho. Se você está dizendo que você vai ter apenas uma instância de conexão DB em seu aplicativo, que o trabalho pode se você pode garantir que seu aplicativo será executado em apenas um thread (ou pelo menos que todas as operações usando a conexão DB não), desde que você pode 't (tanto quanto eu sei de qualquer maneira) executar várias operações em paralelo na mesma conexão.

Além disso, se isso significa que o aplicativo irá manter a conexão aberta entre usos, gostaria de aconselhar contra ele. conexões de banco de dados são recursos limitados no servidor DB, então você deve mantê-los aberta apenas quando eles são necessários, e depois fechá-las.

Singleton significa que a classe que você fez pode ser instanciado apenas uma vez. Então, se você quer que isso aconteça, fazer duas coisas:

  1. Faça o construtor privado. (Isto é para evitar que outras classes de acessá-lo.)
  2. instanciar a classe como:

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top