source

SQL 연결이 삭제되기 전에 닫아야 합니까()해야 합니까?

factcode 2023. 5. 9. 23:03
반응형

SQL 연결이 삭제되기 전에 닫아야 합니까()해야 합니까?

일회용 개체에 대한 다른 질문에 따르면, 사용 블록이 끝나기 전에 닫기()를 호출해야 합니까?

using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
    command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
    command.CommandType = System.Data.CommandType.Text;

    connection.Open();
    command.ExecuteNonQuery();

    // Is this call necessary?
    connection.Close();
}

사용 중인 블록이 있으므로 SQL 명령의 Dispose 메서드가 호출되고 연결이 닫힙니다.

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

에서 SqlConnection을 분해합니다.NET 리플렉터:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }

    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

Dispose() 내부에서 Close()를 호출합니다.

키워드를 사용하면 연결이 올바르게 닫히기 때문에 닫기에 대한 추가 호출이 필요하지 않습니다.

SQL Server 연결 풀링에 대한 MSDN 문서:

"연결이 풀로 돌아갈 수 있도록 사용이 끝나면 항상 연결을 닫는 것이 좋습니다.Connection 개체의 Close(닫기) 또는 Dispose(폐기) 메서드를 사용하거나 C#의 사용에서 모든 연결을 열어 이 작업을 수행할 수 있습니다."

SqlConnection의 실제 구현. 사용하여 폐기합니다.NET Reflector는 다음과 같습니다.

// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

Reflector를 사용하면 다음을 확인할 수 있습니다.Dispose의 방법SqlConnection실제로 방문합니다.Close();

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

아니요, SqlConnection에서 Dispose()를 호출하면 Close()도 호출됩니다.

MSDN - SqlConnection.폐기()

아니요, Using block calls가 있습니다.Dispose()어쨌든 당신을 위해, 그래서 전화할 필요가 없습니다.Close().

아니요, 삭제를 호출하기 전에 연결을 닫을 필요가 없습니다.

SQL Connections와 같은 일부 개체는 Close(닫기)를 호출한 후 다시 사용할 수 있지만 Dispose(폐기)를 호출한 후에는 재사용할 수 없습니다.다른 개체의 경우 Close를 호출하는 것은 Dispose를 호출하는 것과 같습니다. (ManualResetEvent 및 Streams는 이와 같이 작동합니다.)

아니요. SqlConnection 클래스는 ID Disposable에서 상속되며, 연결 개체에 대한 사용이 종료되면 자동으로 Dispose on the SqlConnection 클래스를 호출합니다.

언급URL : https://stackoverflow.com/questions/1195829/do-i-have-to-close-a-sqlconnection-before-it-gets-disposed

반응형