문제

응용 프로그램 중 하나에 사용 된 데이터베이스 연결이 항상 닫힌 것은 아니라고 의심했습니다. 코드를 보러 갔고 수업을 찾았습니다. DataProvider 그건 가지고 있습니다 SqlConnection 물체. 이 클래스의 생성자에서 연결이 열리고 그 안에서 닫힙니다. Dispose 방법 (판단하지 마십시오. 열린 연결을 유지하는 것이 악한다는 것을 알고 있습니다. 그것은 단지 내 코드가 아니며 어쨌든 질문의 요점이 아닙니다). 그만큼 Dispose 방법은 다음과 같이 구현됩니다.

protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        if (disposing)
        {
            if (_conn != null)
                _conn.Close();
        }

        _disposed = true;
    }
}

질문은 ~이야:
연결이 닫혀 있음을 항상 보장합니까?
이 코드가 맞습니까?

나는 있어야한다고 생각한다 _conn.Dispose() 호출 - 내가 옳고 연결을 닫지 않는 영향을 줄 수 있습니까 (아마도 아님)?

도움이 되었습니까?

해결책

처분은 자동으로 호출되지 않습니다.

객체의 Dispose 메소드가 명시 적으로 호출 될 때까지 또는 사용 () 블록에서 클래스를 사용하는 경우 연결이 닫히지 않습니다.

더 안전한 방법은 최종화기에서 Dispose 메소드를 호출하고 Dispose 메소드가 호출 될 때 최종화기가 억제되도록하는 것입니다.

이 기사 패턴을 구현하는 올바른 방법을 제시하십시오

도움이되기를 바랍니다!

세다

다른 팁

conn.Dispose(); 또한 연결을 닫으므로 처분 패턴을 따르기 위해 변경하면 해를 끼칠 수 없습니다.

그러나 기능적으로 동일하므로 다른 곳에 문제가 있어야합니다.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

SQLConnection이 범위를 벗어나지 않으면 닫히지 않습니다. 따라서 Close 또는 폐기로 호출하여 연결을 명시 적으로 닫아야합니다. 가까이 및 폐기는 기능적으로 동일합니다. 연결 풀링 값 풀링이 True로 설정된 경우 기본 연결이 연결 풀로 되돌아갑니다. 반면에 풀링이 False 또는 아니오로 설정되면 서버에 대한 기본 연결이 닫힙니다.

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