Ist die Verwendung eines Singletons für die Verbindung eine gute Idee, in ASP.NET-Website

StackOverflow https://stackoverflow.com/questions/1557592

  •  21-09-2019
  •  | 
  •  

Frage

Ich bin derzeit einen Singleton auf meiner Web-Anwendung mit, so dass es immer nur eine Verbindung zur Datenbank ist.

Ich möchte wissen, ob es eine gute Idee ist, weil gerade jetzt habe ich Probleme mit diesem Fehler:

Timeout abgelaufen. Das Zeitlimit wird vor eine Verbindung aus dem Pool zu erhalten. Dies ist möglicherweise aufgetreten, weil alle zusammengefassten Verbindungen waren im Einsatz und maximale Poolgröße erreicht wurde.

Ein weiterer wichtiger Punkt ist, dass meine Website derzeit in dev und nicht viele Leute gehen auf es so verstehe ich nicht, warum ich diesen Fehler!

Hier ist der Code meiner 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;
        }
    }
}

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

eine einzige Verbindung zu verwenden ist eine extrem schlechte Idee -., Wenn der Zugriff auf die Verbindung ordnungsgemäß verriegelt ist, bedeutet dies, dass ASP.NET nur einen Benutzer zu einem Zeitpunkt dienen kann, die ernsthaft Ihre Anwendung der Fähigkeit begrenzen zu wachsen

Wenn die Verbindung nicht richtig verriegelt ist, kann die Dinge wirklich seltsam bekommen. Zum Beispiel könnte ein Thread die Verbindung verfügt, während ein anderer Thread einen Befehl gegen ihn auszuführen versucht.

Statt eine einzelne Verbindung zu nutzen, sollten Sie nur neue Verbindung erstellen Objekte, wenn Sie sie benötigen, nutzen Sie Verbindungspooling zu nehmen.

Das Verbindungspooling ist das Standardverhalten für die SqlClient Klassen (und wahrscheinlich andere Datenanbieter). Wenn Sie Verbindungspooling verwenden, jedes Mal, wenn eine Verbindung auf ‚Erstellen‘, wird die Verbindung tatsächlich aus einem Pool von bestehenden gezogen werden, so dass Sie ein, die Kosten entstehen nicht jedes Mal von Grund auf neu zu bauen. Wenn Sie loslassen (schließen es oder entsorgen Sie sie) Sie es an den Verbindungspool zurückkehren, Ihre Gesamtzahl der Verbindungen zu halten relativ gering ist.


Edit: Sie werden sehen, die Fehler, den Sie erwähnen ( Die Timeout-Zeit vor verstrichene eine Verbindung aus dem Pool zu erhalten ), wenn Sie nicht sind zu schließen (oder Entsorgung) Ihre Verbindungen. Stellen Sie sicher, dass Sie das tun, sobald Sie fertig sind jede Verbindung.

Es gibt mehrere guten Stapelüberlauf Fragen, die diese Diskussion, die ich vermute, könnte hilfreich sein!

Andere Tipps

Nein, es ist eine schlechte Idee. Sie verwenden Connection Pooling.

Der Grund, warum eine Verbindung zur Datenbank als Singleton verwendet, ist eine schreckliche Idee ist, weil jeder 2. + Verbindung wird dann warten müssen, für die erste Verbindung freigegeben werden.

Ein Singleton bedeutet, dass es nur ein Datenbank-Verbindungsobjekt, an die DB zu verbinden. Also, wenn eine zweite Person will sie verbinden, müssen sie warten, bis sie das Objekt zugreifen können.

Das ist eine schlechte Nachricht.

So halten neue Instanzen der Datenbank-Verbindungsobjekt erstellen, wenn erforderlich. Der Trick hier ist die Verbindung so spät wie möglich zu öffnen und schließen Sie dann die Verbindung so schnell wie möglich.

Die teuerste Operation in einem Datenbank-Verbindungsobjekt, ist die eigentliche Verbindung . nicht die Schöpfung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top