Является ли использование единого для подключения хорошей идеей на веб-сайте ASP.NET - PullRequest
5 голосов
/ 13 октября 2009

В настоящее время я использую в своем веб-приложении синглтон, так что всегда есть только одно соединение с базой данных.

Я хочу знать, хорошая ли это идея, потому что сейчас у меня проблемы с этой ошибкой:

Истекло время ожидания. Время ожидания истекло до получения соединения из пула. Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.

Другим важным моментом является то, что мой веб-сайт в настоящее время находится в разработке, и мало кто заходит на него, поэтому я не понимаю, почему я получаю эту ошибку!

Вот код моего синглтона:

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;
        }
    }
}

Спасибо за вашу помощь!

Ответы [ 4 ]

20 голосов
/ 13 октября 2009

Использование одного соединения является крайне плохой идеей - если доступ к соединению должным образом заблокирован, это означает, что ASP.NET может обслуживать только одного пользователя за раз, что серьезно ограничит способность вашего приложения расти.

Если соединение не должным образом заблокировано, все может стать очень странным. Например, один поток может удалить соединение, в то время как другой поток пытается выполнить для него команду.

Вместо того, чтобы использовать одно соединение, вы должны просто создавать новые объекты соединения, когда они вам нужны, чтобы использовать преимущества пула соединений.

Пул соединений - поведение по умолчанию для классов SqlClient (и, возможно, других поставщиков данных). Когда вы используете пул соединений, каждый раз, когда вы «создаете» соединение, оно будет фактически извлечено из пула существующих, так что вы не будете нести затраты на его создание каждый раз. Когда вы отпускаете его (закрываете или удаляете), вы возвращаете его в пул соединений, сохраняя при этом общее количество соединений относительно низким.


Редактировать: Вы увидите упомянутую ошибку ( Период ожидания истек до получения соединения из пула ), если вы не закрываете (или не удаляете) свои соединения. Убедитесь, что вы делаете это, как только вы закончите, используя каждое соединение.

Есть несколько хороших вопросов о переполнении стека, которые обсуждают это, и я подозреваю, что это может быть полезно!

7 голосов
/ 13 октября 2009

Нет, это плохая идея. Вы используете пул соединений.

4 голосов
/ 13 октября 2009

Причина, по которой использование Соединения с базой данных в качестве одиночного является ужасной идеей, заключается в том, что каждое второе соединение + затем будет ДОЛЖНО ЖДАТЬ первого соединения, которое будет освобождено.

Синглтон означает, что есть только один объект подключения к базе данных для подключения к БД. Поэтому, если второй человек хочет подключиться к нему, ему нужно подождать, пока он не сможет получить доступ к этому объекту.

Это плохие новости.

Просто продолжайте создавать новые экземпляры объекта подключения к базе данных, когда это необходимо. Хитрость в том, чтобы открыть соединение как можно позже, а затем закрыть его как можно скорее.

Самая дорогая операция в объекте соединения с базой данных, это фактическое соединение . не творение.

3 голосов
/ 13 октября 2009
...