문제

오늘 초 프로젝트 중 하나에서 버그를 찾았습니다. 데이터베이스가 닫히지 않는 콘센트가 있습니다. Close () 메소드가 호출되지 않았다는 것을 의미합니다. 그러나 응용 프로그램을 닫으면 연결이 닫힙니다 (SQL Management Studio에서 여러 번 확인). 왜요?

도움이 되었습니까?

해결책

응용 프로그램이 종료되면 연결이 닫힙니다. 읽으십시오 SQLConnection의 마무리. MSDN의 문서에서 object.finalize:

"애플리케이션 도메인을 종료하는 동안 최종화가 면제되지 않는 객체, 심지어 여전히 액세스 할 수있는 개체에서는 결승전이 자동으로 호출됩니다."

다른 팁

여기서 명심해야 할 또 다른 사항은 .NET에서 연결을 사용하는 블록으로 감싸고 연결을 닫고 폐기한다는 것입니다. 따라서 명시적인 Close ()의 부족은 블록을 사용하는 경우 나쁘지 않습니다.

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

그것은 마지막으로 conn.close와 함께 시도/마침내 블록의 기능적 동등한 것입니다. 많은 개발자들이 사용 블록을 간과합니다.이 경우 동일하지 않은지 확인하십시오.

연결을 닫기 위해 코드를 다시 작성하는 경우 - 모든 데이터베이스 개체 (Connection, Command, Reader) 주변의 블록을 사용하여 사용하는 블록의 범위가 떨어지면 닫히고 처분하는지 확인하는 것이 좋습니다. . 필요한 경우 Conn.Close () 대신 코드에 작성하는 것이 좋습니다.

SQL Connections는 작성하는 데 비싸고 Ado.net은 연결 풀링이라는 기술을 사용하여 재사용 할 수 있습니다.

인용 MSDN:

연결을 완료 할 때 연결을 닫아 연결 풀로 되돌아 가서 재사용 할 수 있도록하는 것이 좋습니다.

최대 풀 크기에 도달하고 사용 가능한 연결을 사용할 수없는 경우 요청이 대기됩니다. 그런 다음 풀러는 타임 아웃에 도달 할 때까지 연결을 되 찾으려고합니다 (기본값은 15 초). 풀러가 연결 시간이 끝나기 전에 요청을 만족시킬 수 없으면 예외가 발생합니다.

정기적으로 응용 프로그램을 종료하면 최종화 업체가 실행될 것으로 예상됩니다. 연결이 여전히 열려 있으면 연결을 닫습니다. 이에 의존하지 마십시오. 최종화 업체가 응용 프로그램의 정상 작동에서 실행되기까지 시간이 걸릴 수 있으므로 너무 많은 연결을 열어줍니다.

응용 프로그램이 충돌하면 최종화기가 실행되지 않아 연결이 응용 프로그램의 수명을 지나면 연결을 열어줍니다.

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