반환 명령문이 사용 명령문이 데이터베이스에 대한 연결을 닫지 못하게 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/588396

문제

임시 테이블을 만들 때 온도 테이블이 이미 존재한다는 오류 메시지가 표시됩니다. 임시 테이블은 세션에 고유하므로 내 연결이 제대로 닫히지 않는 것 같습니다. 사용 설명서에있는 반환 문과 관련이있을 수 있습니다.

다음 코드가 있습니다.

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}

여러 장소에서 이런 종류의 코드를 사용하여 동일한 이름의 온도 테이블을 만듭니다.

불행히도 다음 오류가 발생합니다. There is already an object named '#MyTempTable' in the database.

이제 온도 테이블이 세션에 고유하다는 것을 알고 있으므로 세션이 닫히면 사라져야합니다.

내가 이것을 일으킬 수 있다고 믿는 세 가지가 있습니다 ...

  1. Connection.close ()를 호출해야합니다.
  2. 사용 설명서 외부에 반환 명령문을 배치해야합니다.
  3. 돌아 오기 전에 만든 온도 테이블을 떨어 뜨려야합니다.

누구인지 아는 사람이 있습니까? 아니면 내가 생각하지 않은 것이 있다면?

도움이 되었습니까?

해결책

여기서 추측하지만 데이터베이스 연결 풀링 설정을 확인하십시오. 풀링을 끄고 도움이되는지 확인하십시오.

일반적으로 .NET 라이브러리 레벨에서 연결을 닫거나 배제하면 실제 데이터베이스 서버 연결이 닫히지 않습니다. 데이터 제공 업체 내부의 Connection Pool로 반환되며 프로그램이 동일한 매개 변수 및 자격 증명으로 다른 연결을 요청하면 재사용됩니다. 공개 트랜잭션 및 기본 매개 변수를 제외하고는 풀로 반환되기 전에 데이터베이스 세션이 어떤 식 으로든 재설정되지 않는다고 생각합니다. 임시 테이블과 같은 더 비싼 물체는 홀로 남습니다.

풀링을 끄면 (매우 비효율적). 또는 임시 테이블 존재를 확인하기 전에 임시 테이블 존재를 확인하고 콘텐츠가 존재하는 경우 컨텐츠를 삭제할 수 있습니다. 또는 연결을 닫기 전에 임시 테이블을 떨어 뜨릴 수 있습니다.

다른 팁

Connection.Dispose () (및 Connection.Close ()도 호출 될 것이라고 확신합니다.

1)과 2)를 수행하여 문제가 여전히 존재하는지 확인하여 쉽게 확인할 수 있습니다. 솔루션은 아마도 3) 그리고 설명은 연결 풀링 일 것입니다.

전원주기가 발생하거나 다른 심각한 기괴한 코너 케이스 처리가 호출되지 않는 한.

증거를 원한다면 객체를 감싸고 중단 점을 넣으십시오.

사용 블록은 후드 아래에서 시도/캐치/마침내 블록으로 변환됩니다. 예, 사용 블록 내의 반환에 관계없이 처분합니다.

아니요, Connection.close는 항상 내부적으로 호출됩니다 사용 시도/마침내 블록에 넣습니다.

연결 풀링을 고려할 수도 있습니다. TransactionScope에 코드를 감싸십시오.

질문에 답하기 위해 :

  1. 사용 명령문은 연결의 처분 메소드가 호출되면 연결을 암시 적으로 닫습니다.
  2. 필요하지 않아야합니다. http://aspadvice.com/blogs/name/archive/2008/05/22/return-within-a-c_2300_-using-statement.aspx
  3. 시도 해봐.

사용 블록 내에 반환 문이 있더라도 클래스가 idisposable 인 경우 명령문을 사용하면 객체를 처리합니다.

#Temptable을 유지하는 것은 연결 풀링입니다. 해당 테이블을 수동으로 떨어 뜨릴 수 있습니다.

사용중인 데이터베이스 연결 라이브러리에 대해 더 많이 알지 못하면 처음 두 가지 중 어느 것도 아니라고 생각합니다. using 방법을 벗어날 때 그러한 자원을 더 쉽게 청소할 수 있도록 특별히 소개되었습니다. 평범한 것과 직접 유사합니다 try...finally 자바 또는 이와 유사한 차단.

다시 말해, return 블록과 Dispose 메소드는 연결에 호출되며, 그러한 제정신 구현을 가정하면 Close 그 과정의 일부로서의 방법.

여기서 핵심 요점은 "Sane 구현"입니다.

연결 풀링으로 인해 발생합니다. 트랜잭션에서하고있는 일을 감싸서 끝에 다시 굴립니다. 또는 DS를 채운 후 온도 테이블을 떨어 뜨립니다.

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