Domanda

Attualmente sto usando un singoletto sulla mia applicazione web in modo che ci sia sempre una sola connessione al database.

Vorrei sapere se è una buona idea, perché adesso sto avendo problemi con questo errore:

Timeout scaduto. Il periodo di timeout trascorso prima di ottenere una connessione dal pool. Questo potrebbe essersi verificato perché tutte le connessioni in pool erano in uso ed è stato raggiunto dimensione massima piscina.

Un altro punto importante è che il mio sito è attualmente in dev e non un sacco di gente va su di esso quindi non capisco perché ottengo questo errore!

Ecco il codice della mia 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;
        }
    }
}

Grazie per il vostro aiuto!

È stato utile?

Soluzione

Utilizzo di una singola connessione è una pessima idea - se l'accesso alla connessione sia correttamente bloccato, significa che ASP.NET può servire un solo utente alla volta, che sarà seriamente limitare la capacità dell'applicazione di crescere

Se la connessione è non bloccato correttamente, le cose possono diventare davvero strano. Ad esempio, un filo potrebbe disporre la connessione mentre un altro thread tenta di eseguire un comando su di esso.

Invece di usare una singola connessione, si dovrebbe solo creare nuovi oggetti di connessione quando ne hai bisogno, per sfruttare il pool di connessioni.

Il pool di connessioni è il comportamento di default per le classi SqlClient (e probabilmente altri fornitori di dati). Quando si utilizza il pool di connessioni, ogni volta che si 'creare' una connessione, il collegamento sarà effettivamente essere tirato da un pool di quelli esistenti in modo da non incorrere i costi di costruzione di uno da zero ogni volta. Quando si rilascia (chiuderlo o disporne) lo restituite al pool di connessioni, mantenendo il valore del totale delle connessioni relativamente basso.


Modifica: Vedrai l'errore si parla ( Il periodo di timeout trascorso prima di ottenere una connessione dal pool ), se non si sta chiudendo (o lo smaltimento) le connessioni. Assicurati di fare che non appena hai finito di utilizzare ogni connessione.

Ci sono diverse buone domande di overflow dello stack che trattano questo, che ho il sospetto potrebbe essere utile!

Altri suggerimenti

No, è una cattiva idea. Si utilizza il pool di connessioni.

Il motivo per cui si utilizza una connessione al database come un Singleton è un'idea orribile, è perché ogni 2 + collegamento dovranno quindi attendere il primo collegamento per essere rilasciato.

Un Singleton significa che c'è un solo oggetto di connessione al database, per la connessione al db. Quindi, se una seconda persona vuole connettersi ad esso, hanno bisogno di aspettare fino a quando non possono accedere a tale oggetto.

Questa è una cattiva notizia.

Basta continuare a creare nuove istanze dell'oggetto connessione al database, quando richiesto. Il trucco è quello di aprire il collegamento il più tardi possibile e quindi chiudere quel collegamento più breve tempo possibile.

L'operazione più costosa in un oggetto di connessione al database, è l'attuale collegamento . non la creazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top