Pergunta

Atualmente, estou usando um singleton no meu aplicativo da web para que sempre haja apenas uma conexão com o banco de dados.

Quero saber se é uma boa ideia, porque agora estou tendo problemas com esse erro:

Tempo limite expirou. O período de tempo limite decorrido antes de obter uma conexão do pool. Isso pode ter ocorrido porque todas as conexões combinadas estavam em uso e o tamanho do piscina máximo foi alcançado.

Outro ponto importante é que meu site está atualmente em Dev e muitas pessoas não saem, então não entendo por que recebo esse erro!

Aqui está o código do meu singleton:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// This class take care of all the interaction with the database
/// </summary>
public class DatabaseFacade
{
    SqlConnection m_conn = null;

    string m_csLanguageColumn;

    //Variables that implement the Singleton pattern
    //Singleton pattern create only one instance of the class
    static DatabaseFacade instance = null;
    static readonly object padlock = new object();

    /// <summary>
    /// Private constructor. We must use Instance to use this class
    /// </summary>
    private DatabaseFacade()
    {
    }

    /// <summary>
    /// Static method to implement the Singleton
    /// </summary>
    public static DatabaseFacade Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new DatabaseFacade();
                }
                return instance;
            }
        }
    }

    /// <summary>
    /// Do the connection to the database
    /// </summary>
    public void InitConnection(int nLanguage)
    {
        m_conn = new SqlConnection(GetGoodConnectionString());

        try
        {
            //We check if the connection is not already open
            if (m_conn.State != ConnectionState.Open)
            {
                m_conn.Open();
            }

            m_csLanguageColumn = Tools.GetTranslationColumn(nLanguage);

        }
        catch (Exception err)
        {
            throw err;
        }
    }
}

Obrigado pela ajuda!

Foi útil?

Solução

O uso de uma única conexão é uma idéia extremamente ruim - se o acesso à conexão estiver bloqueado corretamente, significa que o ASP.NET pode servir apenas um usuário por vez, o que limitará seriamente a capacidade do seu aplicativo de cultivar.

Se a conexão for não Devidamente trancados, as coisas podem ficar realmente estranhas. Por exemplo, um thread pode descartar a conexão enquanto outro thread está tentando executar um comando contra ele.

Em vez de usar uma única conexão, basta criar novos objetos de conexão quando precisar deles, para aproveitar o pool de conexões.

O agrupamento de conexões é O comportamento padrão para as classes SQLCLIENT (e provavelmente outros provedores de dados). Quando você usa o pool de conexões, sempre que você 'cria' uma conexão, a conexão será realmente puxada de um pool de existentes, para que você não incorra nos custos de construir um do zero de cada vez. Ao liberá -lo (feche ou descarta -o), você o devolve ao pool de conexões, mantendo a contagem total de conexões relativamente baixa.


Editar: você verá o erro que menciona (O período de tempo limite decorrido antes de obter uma conexão da piscina) se você não estiver fechando (ou descartando) suas conexões. Certifique -se de fazer isso assim que terminar usando cada conexão.

Existem várias boas perguntas sobre o Stack Overflow que discutem isso, o que eu suspeito que possa ser útil!

Outras dicas

Não, é uma má ideia. Você usa o pool de conexões.

A razão pela qual o uso de uma conexão com o banco de dados como um singleton é uma idéia horrível é porque cada conexão de 2º+ terá que aguardar que a primeira conexão seja liberada.

Um singleton significa que existe apenas um objeto de conexão de banco de dados, para se conectar ao banco de dados. Portanto, se uma segunda pessoa quiser se conectar a ela, precisa esperar até que possa acessar esse objeto.

Isso é uma má notícia.

Continue criando novas instâncias do objeto de conexão do banco de dados, quando necessário. O truque aqui é abrir a conexão o mais tarde possível e fechar essa conexão o mais rápido possível.

A operação mais cara em um objeto de conexão de banco de dados é o real conexão. não a criação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top