Question

J'utilise actuellement un singleton sur mon application Web afin qu'il y ait toujours une seule connexion à la base de données.

Je veux savoir si elle est une bonne idée parce que je suis en ce moment des problèmes avec cette erreur:

Délai d'attente expiré. Le délai d'attente écoulé avant d'obtenir une connexion de la piscine. Cela peut se produire parce que toutes les connexions regroupées étaient en cours d'utilisation et la taille de la piscine max a été atteint.

Un autre point important est que mon site est actuellement en dev et pas beaucoup de gens vont là-dessus, donc je ne comprends pas pourquoi je reçois cette erreur!

Voici le code de mon 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;
        }
    }
}

Merci pour votre aide!

Était-ce utile?

La solution

En utilisant une seule connexion est une très mauvaise idée - si l'accès à la connexion est correctement verrouillé, cela signifie que ASP.NET ne peut servir un utilisateur à la fois, ce qui limitera sérieusement la capacité de votre application à croître

Si la connexion est pas correctement verrouillé, les choses peuvent devenir vraiment bizarre. Par exemple, un thread peut disposer de la connexion pendant un autre thread tente d'exécuter une commande contre.

Au lieu d'utiliser une seule connexion, vous devez simplement créer de nouveaux objets de connexion lorsque vous avez besoin pour profiter de la mise en commun de connexion.

mise en commun de connexion est le comportement par défaut pour les classes SqlClient (et probablement d'autres fournisseurs de données). Lorsque vous utilisez la mise en commun de connexion, chaque fois que vous « créer » une connexion, la connexion sera effectivement tiré d'un bassin de ceux qui existent déjà afin que vous ne subissez pas les coûts de la construction à partir de zéro à chaque fois. Lorsque vous relâchez (fermer ou en disposer) vous retournez à la piscine de connexion, en gardant le nombre total de connexions relativement faible.


Edit: Vous verrez l'erreur que vous mentionnez ( Le délai écoulé avant d'obtenir une connexion de la piscine ) si vous ne fermez pas (ou disposer) vos connexions. Assurez-vous de le faire dès que vous avez fini d'utiliser chaque connexion.

Il y a plusieurs bonnes questions de débordement de pile qui traitent de ce que je soupçonnais pourrait être utile!

Autres conseils

Non, c'est une mauvaise idée. Vous utilisez la mise en commun de connexion.

La raison pour laquelle l'aide d'une connexion à la base de données en tant que singleton est une idée horrible, est parce que tous les 2 + connexion devront alors attendre la première connexion à libérer.

A singleton signifie qu'il n'y a qu'un seul objet de connexion de base de données pour se connecter à la DB. Donc, si une deuxième personne veut se connecter, ils doivent attendre jusqu'à ce qu'ils puissent accéder à cet objet.

Ce sont de mauvaises nouvelles.

Il suffit de continuer à créer de nouvelles instances de l'objet de connexion de base de données, en cas de besoin. L'astuce ici est d'ouvrir la connexion le plus tard possible, puis fermer cette connexion le plus rapidement possible.

L'opération la plus coûteuse dans un objet de connexion de base de données, est la connexion réelle . pas la création.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top