문제

나는 현재 사용하여 단일 내에 웹 응용 프로그램도록 항상 단 하나의 데이터베이스에 연결.

지 알고 싶다면 그것은 좋은 생각하기 때문에 지금 내가 문제가 있는 오류:

제한 시간이 만료되었습니다.기 전에 제한 시간이 경과에서 연결을 얻기실 수 있습니다.이 발생했을 수 있기 때문에 모든 풀 연결에 사용하고 최대 수영장 크기에 도달했습니다.

또 다른 중요한 점은 웹사이트는 현재에서 개발 및 많은 사람들이 그것에 그래서 내가 이해하지 않는 이유가 이 오류!

여기에는 코드의 내는 단일:

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 봉사할 수 있다 한 번에 한 사용자는 심각하게 제한 할 수있는 응용 프로그램의 기능을 성장합니다.

는 경우 연결이 제대로 잠기는 것을 얻을 수 있습니다 정말 이상합니다.예를 들어,하나의 스레드가 폐기 연결하는 동안 또 다른 스레드를 실행하려고 하면 명령합니다.

를 사용하는 대신 하나의 연결만 만들어야 합 새로운 연결 객체를 필요로 할 때 그들을 활용하는 연결 풀링을 수행합니다.

연결은 풀링 기본 행동에 대한 따스 (아마도 다른 데이터 제공).을 사용할 때 연결 풀링,언제든지 당신은'만들기'연결 연결이 실제로 끌 수영장에서의 기존하지 않도록 비용이 발생할 건물 중 하나 처음부터 각 시간입니다.당신이 그것을 해제하는 경우(가까운 그것은 또는 그것의 처분)를 반환하고 연결이 수영장을 유지하의 총 수의 연결 상대적으로 낮습니다.


편집:당신이 볼 수는 오류를 언급(기 전에 제한 시간이 경과된 연결을 얻기에서는 수영장)지 않는 경우 폐쇄(또는 처분)의 연결이 있습니다.당신은 곧 당신이 사용하여 수행됩 연결합니다.

거기에 몇 가지 좋은 stack overflow 질문에 대해 설명하는 이는 나는 의심되는 것이 도움이 될 수 있습!

다른 팁

아니요, 나쁜 생각입니다. 연결 풀링을 사용합니다.

싱글 톤으로 데이터베이스에 연결을 사용하는 것이 끔찍한 아이디어 인 이유는 두 번째+ 연결이 첫 번째 연결이 해제 될 때까지 기다려야하기 때문입니다.

싱글 톤은 DB에 연결하는 데이터베이스 연결 객체가 하나만 있다는 것을 의미합니다. 따라서 두 번째 사람이 연결하려면 해당 물체에 액세스 할 수있을 때까지 기다려야합니다.

그것은 나쁜 소식입니다.

필요한 경우 데이터베이스 연결 객체의 새로운 인스턴스를 계속 작성하십시오. 여기서의 요령은 가능한 빨리 연결을 열고 가능한 빨리 연결을 닫는 것입니다.

데이터베이스 연결 객체에서 가장 비싼 작업은 실제입니다. 연결. 창조가 아닙니다.

싱글 톤이 필요하지 않습니다. 연결 풀링에 관한 몇 가지 기사는 다음과 같습니다.

.NET 1.1

SQL Server 용 .NET Framework 데이터 제공 업체의 연결 풀링

.NET 2.0

SQL Server와의 연결 풀링 사용

.NET 3.0

연결 풀링 사용

.NET 3.5

SQL Server Connection Pooling (ado.net)

.NET 4.0

SQL Server Connection Pooling (ado.net)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top