Está usando un producto único para la conexión de una buena idea en la página web ASP.NET

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

  •  21-09-2019
  •  | 
  •  

Pregunta

Actualmente estoy usando un producto único en mi aplicación web por lo que siempre hay sólo una conexión a la base de datos.

Quiero saber si es una buena idea porque en este momento estoy teniendo problemas con ese error:

Tiempo de espera agotado. El período de tiempo de espera transcurrido antes de obtener una conexión de la agrupación. Esto puede deberse a que todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño de la piscina máx.

Otro punto importante es que mi sitio web está actualmente en dev y no un montón de gente va en ella, así que no entiendo por qué me sale este error!

Este es el código de mi 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;
        }
    }
}

Gracias por su ayuda!

¿Fue útil?

Solución

El uso de una única conexión es una muy mala idea - si el acceso a la conexión está bloqueada correctamente, significa que ASP.NET sólo puede servir a un usuario a la vez, lo que limitará gravemente la capacidad de la aplicación para crecer

Si la conexión es no correctamente bloqueado, las cosas pueden ser muy raro. Por ejemplo, un hilo podría disponer la conexión mientras otro hilo está tratando de ejecutar un comando en contra de ella.

En lugar de utilizar una única conexión, simplemente deberá crear nuevos objetos de conexión cuando los necesite, para tomar ventaja de la agrupación de conexiones.

La agrupación de conexiones es el comportamiento por defecto para las clases SqlClient (y probablemente otros proveedores de datos). Cuando se utiliza la agrupación de conexiones, cada vez que 'crear' una conexión, la conexión realidad se tiró de un grupo de los ya existentes para que no incurra en los costes de construir uno desde cero cada vez. Al soltarlo (cerrarla o deshacerse de ella) que lo devuelve a la agrupación de conexiones, manteniendo su número total de conexiones relativamente bajo.


Editar: Usted verá el error que mencionas ( El tiempo de espera transcurrido antes de obtener una conexión de la agrupación ) si no estás de cierre (o eliminación) de sus conexiones. Asegúrese de hacer que tan pronto como haya terminado el uso de cada conexión.

Hay varias buenas preguntas de desbordamiento de pila que discuten este, y sospecho que podría ser útil!

Otros consejos

No, es una mala idea. Se utiliza la agrupación de conexiones.

La razón por la cual se utiliza una conexión a la base de datos como un conjunto unitario es una idea horrible, es porque cada segundo de conexión + entonces tendrán que esperar a que la primera conexión a ser puesto en libertad.

Un producto único significa que sólo hay una conexión a la base de datos de objetos, para conectarse a la base de datos. Así que si una segunda persona quiere conectarse a él, tienen que esperar hasta que puedan acceder a ese objeto.

Eso es una mala noticia.

Hemos de tener la creación de nuevas instancias del objeto de conexión de base de datos, cuando sea necesario. El truco aquí es para abrir la conexión lo más tarde posible y luego se cerrará esa conexión tan pronto como sea posible.

La operación más cara de un objeto de conexión de base de datos, es la conexión real . no la creación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top