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

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

  •  21-09-2019
  •  | 
  •  

Вопрос

В настоящее время я использую 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;
        }
    }
}

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

Это было полезно?

Решение

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

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

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

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


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

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

Другие советы

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

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

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

Это плохая новость.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top