.NET에서 SQL 연결 상태를 기억하고 있습니까?

.net c# connection-pooling dapper sqlconnection

문제

옆에있는 오래된 알려진 사실 connection.Close()connection.Dispose() 동일이 - 그 실행을 제외하고 Close() 실행하는 동안 삭제 된 연결을 통해 예외를 발생 Close() 닫힌 연결을 통해 것은 - OK입니다 - 난 아직이 질문 :

연결 풀링이 켜져 있다고 가정하면 (기본값) - 연결 상태를 기억하는 것이 중요한 이유 는 무엇입니까?

여기에이 질문을 읽었습니다. 연결을 열거 나 닫지 마십시오 . 성능이 떨어 집니다.

이것은 논리처럼 보이지만 문제는 연결이 실제로 닫히지 않는다는 것입니다. 그것은 단지 닫힌 채로 표시되어 있습니다.

using 범위 아래에서 using 하는 경우에도 처분은 연결을 닫고 다시 풀에 넣습니다.

내가 원한다고해도 나는 그것을 열어 둘 수 없었다. 왜냐하면 다른 사람들이 그것을 사용하기를 원하기 때문이다 . 그래서 나는 그것을 닫아야 만했다.

이 동작을 구현하는 Dapper살펴보면 다음과 같습니다.

public static async Task<IEnumerable<T>> QueryAsync<T>(this...)
        {
         //...
            bool wasClosed = cnn.State == ConnectionState.Closed;
            using (var cmd = (DbCommand)command.SetupCommand(cnn, info.ParamReader))
            {
                try
                {
                    if (wasClosed) await ((DbConnection)cnn).OpenAsync()...
                  //...
                }
                finally
                {
                    if (wasClosed) cnn.Close();
                }
            }
        }

보시다시피 "암기"가 여기서 구현됩니다.

nb, 나는 Marc에게 이미 GetClosedConneciton 샘플에서 GetClosedConnecitonGetOpenConnection 모두 사용하고 Dapper가 두 시나리오를 처리 할 수있는 답변을 제시하는 이유를 GetOpenConnection . 그러나 현재의 질문은 연결 상태를 다시 설정 하는 이유입니다.

문제 :

Dapper 코드를 보면 상태를 기억하고 작동 후 상태를 다시 설정 한 것으로 보입니다. (또한 이전 sqldataadapter 클래스에서이 동작을 알고 있습니다)

질문은 - 왜? 닫힌 연결이있는 경우 - 열어야합니다. 큰. 그러나 나는 조건으로 그것을 왜 닫아야합니까? 항상 그것을 닫지 않는 이유는 무엇입니까? 연결이 실제로 닫히지 않기 때문에 퍼포먼스에 해를 끼치 지 않을 것입니다 - 이것은 풀에만 리턴됩니다.

다른 방법은 주위에 - 만약 내가 연결을 열고, 그럼 난 일을하고 열어 (응?)

당신이 보시다시피, 나는 여기서 뭔가를 놓치고 있습니다. 누군가 빛을 비출 수 있습니까?

수락 된 답변

항상 그것을 닫지 않는 이유는 무엇입니까?

사용자는 해당 연결에서 많은 작업을 수행 할 수 있습니다. 트랜잭션과 연관 될 수 있습니다 (닫으면 고아가됩니다). 임시 테이블 (닫을 경우 닫을 수 있음) 또는 기타 연결 유지 상태 ( SET 옵션, 가장 등)를 가질 수 있습니다.

여기에 연결을 닫으면 (원래 열려 있던 경우) 여러 가지 고약한 부작용이있는 예상치 못한 예기치 않은 현상이됩니다.


인기 답변

만약 당신이 소비자가 당신에게 (어떤 맛의) 연결 객체를 전달하는 것이 이해가되는 라이브러리 함수를 작성한다면 가장 안전한 방법은 그 연결을 존중하는 것입니다 :

  • 오픈 커넥션 객체를 전달한 경우에는 그것에 대해 아무런 가정을하지 않고 작업을 완료 한 후에는 닫지 마십시오. 소비자가 수행 한 작업을 알지 못하거나 작업을 수행 할 것인지 알 수 없습니다.
  • 닫힌 연결 개체를 통과 한 경우 사용하려고하기 전에 먼저 연결 개체를 열어 두는 것이 좋습니다. 작업을 마친 후에 닫는 것이 좋습니다. 예를 들어 소비자가 트랜잭션을 열 수는 없다는 것을 알고 있습니다. 닫힌 연결.

코드가 연결 객체를 생성하면, 나는 항상 창조가에 배치하는 것이 좋습니다 것 using 문과 작업이 완료되면 그래서 항상 닫힙니다.

따라서, 내가 말할 수있는 유일한 나머지 점은 함수를 작성하는 것에 대해 신중하게 생각하고 소비자가 연결 개체를 전달하는 것이 합리적 인지 여부를 결정하는 것입니다. 작업을 항상 고립적으로 수행해야한다면 더 많은 작업을 수행해야합니다. 예를 들어 연결 문자열을 요청하고 코드가 연결을 완전히 제어 할 수있는 감각.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.