2012-09-30 2 views
0

일정 기간 동안 사용하지 않으면 SqlConnections가 닫힌 것으로 보입니다. 연결이 열려있는 기간을 제어 할 수 있어야합니다. 연결에 대해 구성 할 수있는 "연결 시간 초과"및 "연결 수명"속성이 있지만 필요한 것은 수행하지 않습니다.지정한 기간 동안 SqlConnection을 열도록하십시오.

문제는 우리의 응용 프로그램이 방대하고 많은 화면에서 일부 화면이 열려있을 때 연결이 닫히지 않는다는 것입니다. 사용자는 화면을 연 다음 점심을 먹은 다음 다시 돌아와 무언가를 시도하고 "연결이 끊어졌습니다"예외를 얻을 수 있습니다. 나는 그것이 반 패턴이라는 것을 알고 있지만, 연결 수명을 한 곳에서 확장 한 다음 수천 곳에서 연결을 열고 닫고 연결하는 것이 더 쉬울 것입니다.

+2

응답은 응용 프로그램을 수정 한 후 연결을 닫도록 응용 프로그램을 수정하는 것입니다. 당신이 찾고있는 것은 존재하지 않습니다 - 연결 시간 제한은 유일한 다른 옵션입니다. – Oded

답변

0

앱을 매우 잘못 디자인하고 있습니다. 연결은 단일 쿼리 집합 (즉, 단일 작업에 필요한 쿼리)보다 오래 열려 있으면 안됩니다. SqlConnection은 연결 문자열을 기반으로 연결을 내부적으로 풀링하므로 성능 문제는 없습니다. 따라서 연결을 열고 닫을지라도 REAL 연결은 일정 기간 동안 열려 있습니다.

내부적으로 연결이 닫히면 풀러가 필요할 때 다시 열리므로 걱정할 필요가 없습니다.

연결을 사용하는 것처럼 연결을 열거 나 닫아야합니다. 그것이 작동해야하는 방법입니다.

참고 : 연결이 닫히는 이유는 내부 연결 풀러가 오랫동안 열려있는 연결을 "회수"한다는 것입니다. 그래서 연결을 열어 두는 것이 연결 풀러와 싸우는 것입니다.

+0

@usr - 좋은 캐치, 다중 쿼리를 포함 할 수있는 단일 논리 연산을 의미했습니다. –

0

연결이 자동으로 닫히지 않습니다. 네트워크와 같은 문제가 발생했습니다.

그래도 기대됩니다. 연결을 열지 마십시오! 시스템을 사용하는 방법에 대해 노력하고 있으며, 시스템을 사용하면 어려움을 겪을 것입니다.

작업 단위당 하나의 연결을 사용하도록 응용 프로그램을 변경하고 닫으십시오. 응급 처치로, 쿼리를 실행하기 전에 SqlConnection.StateOpen인지 확인하십시오.

+0

실제로 연결 풀러는 일정 기간이 지나면 열린 연결을 회수합니다. @MystereMan을 닫은 상태에서 풀로 반환 한 경우에만 http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.80).aspx –

+0

@MystereMan을 참조하십시오. SqlConnection 개체를 열어두면 아무도 그 아래에서 닫히지 않습니다. 그것은 끔찍할 것입니다! 예기치 않게 트랜잭션을 중단합니다. 잠재적으로 모든 쿼리에 오류를 주입하여 가용성 문제를 일으킬 수 있습니다. – usr

+0

그것은 끔찍하고 예측할 수 없지만, 어떻게 될까요. 내가 보낸 링크를 읽으십시오. "연결 풀러는 연결 풀에서 닫기 또는 삭제로 닫히지 않은 사용되지 않는 연결을 찾고 연결 풀을 회수합니다." 및 "연결 풀러가 오랜 시간 동안 유휴 상태이거나 풀러가 서버와의 연결이 끊어 졌음을 감지 한 경우 풀에서 연결을 제거합니다." –

-1

오랫동안 연결을 열지 못했습니다. 필요할 때마다 연결을 열고 데이터베이스 작업 완료 후 닫습니다. 응용 프로그램 성능에 영향을 미칠 것으로 생각되면 연결 풀링을 사용하십시오.

+0

감사합니다. 내 질문에 똑같은 말을 했어. –