2009-05-22 3 views
5

.NET 응용 프로그램에서 하나의 공유 SqlConnection 개체를 모든 데이터베이스 연결에 사용하는 것이 좋습니까? 아니면 데이터베이스에 액세스 할 때마다 별도의 SqlConnection 개체를 사용해야합니까?공유 SqlConnection

현재 공유하고있는 문제가 있으며 갑자기 문제가있는 것 같습니다. Windows 인증 모드 대신 SQL 인증 모드를 사용해야 할 때 공유 권한을 사용할 수없는 것 같습니다. 방금 SQL 인증을 사용하여 처음 시도했을 때 동일한 연결을 두 번째 시도했을 때이 오류가 발생했습니다.

먼저이 명령과 관련된 열려있는 DataReader가 먼저 닫혀 있어야합니다.

답변

4

정말 별개의 것이 있습니다. 연결 재사용은 connection pooling으로 처리됩니다. 다른 사람들과 마찬가지로 MARS를 활성화하면 아마도 2 번째 문제가 해결 될 수 있습니다.

0

SQL Server 2000을 사용하는 경우 this이 질문에 대답 할 수 있습니다.

"MAR의 기본 설정이 변경 되었기 때문에 기본적으로 설정되어 있으며 RC1의 기본 설정으로 변경되었습니다. 따라서 연결 문자열을로 변경하십시오. 다시 추가하십시오 (MultipleActiveResultSets = 연결 문자열에 True 추가). "

1

많은 내용이 dup from here 일 수 있습니다. 간단히 말해, 대부분의 상황에서 연결이 짧고 지역적으로 유지됩니다. 데이터 판독기를 다시 읽습니다. 아마도 MARS을 사용 하시겠습니까?

1

단일 스레드의 경우 단일 SqlConnection 개체를 사용하는 것이 더 효과적 일 수 있지만 연결에 걸려 DB 서버 리소스가 필요 이상으로 오래 걸리므로 데이터베이스 서버의 소중한 리소스에 대한 요구가 높아집니다.

가능한 한 짧은 기간 동안 SqlConnection을 인스턴스화하는 것이 좋습니다. 연결 풀링은 연결 설정의 대부분의 비용을 줄이고 데이터베이스 자원을 가장 효율적으로 사용합니다.

3

이 오류는 인증과 전혀 관련이 없습니다. ExecuteReader()에서 반환 된 SqlDataReader를 닫기 전에 중간에서 연결을 다시 사용하고 있습니다. 이것은 금지되어 있습니다. 코드를 확인하고 문제를 제거해야합니다. MARS (multiple active record sets)를 사용할 수있는 대안이 있지만 그 사실을 강력하게 권장하지 않습니다.

응용 프로그램에서 다중 연결을 사용하면 분명히 어떤 연결이 사용 중인지 알 수 없으므로 더 나쁠 것입니다. 따라서 별도의 연결을 사용할 때 트랜잭션 일관성 문제가 발생합니다.

+0

"MARS를 사용하지 마십시오"라고 말하면 어떤 특별한 이유가 있습니까? 호기심이 ... –

+0

http://blogs.msdn.com/sqlnativeclient/archive/2006/09/27/774290.aspx에서 MARS 사용에 대한 몇 가지 부정적인 점을 설명합니다. – RichardOD

+2

MARS의 트랜잭션 격리 모델은 다음과 같이 불완전합니다. 이론적으로 완전히 정의되지는 않았습니다. 그 결과 Richard가 게시 한 링크가 인정하기 때문에 서버가 '혼란스러워'질 수 있습니다. '혼동'은 일반적으로 가능한 상호 작용 수가 너무 많아서 서버의 모든 코드 경로가 테스트되고 유효성이 검사되지 않는다는 것을 의미합니다. –

2

문제는 현재 SqlDataReader에서 사용중인 연결을 사용하려고하는 것입니다. 너는 그렇게 할 수 없다. SqlDataReader를 사용할 때는 소비되는 연결을 다시 사용하기 전에 닫아야합니다. DB에 액세스 할 때마다 (SqlDataReaders뿐만 아니라 언제든지) 다른 연결을 만드는 것이 좋습니다. 풀링을 사용하도록 설정 한 경우 프레임 워크 자체 (또는 SqlServer?)가 가능한 경우 연결을 다시 사용합니다.

DB에 순차적으로 액세스해야하는 경우 select, then select 및 update를 수행하면 연결 (즉, 동일한 SqlConnection 인스턴스)을 다시 사용할 수 있지만 액세스해야하는 경우 DB를 SqlDataReader에서 읽는 동안 2 개의 다른 연결이 필요합니다.

물론 동시성 문제를 염두에 두어야합니다.트랜잭션을 사용하는 경우 특정 작업 중에 일부 레코드가 잠길 수 있으며 다른 쿼리와 병렬로 SqlDataReader를 사용하는 경우 격리 수준을 나머지 쿼리와 혼동하지 않는 수준으로 설정해야합니다.

관련 문제