2011-12-12 3 views
0

데이터베이스 (SQL Server 2005)에서 상태를 업데이트하려고하는 여러 스레드를 만드는 Windows 서비스 (C#)가 있습니다.다중 스레드 데이터베이스 업데이트

처음에는 SELECT과 실행해야 할 UPDATE이 있습니다. 내 스레드를 동기화하기 위해 잠금 장치를 사용하지 않을 때, 나는 오류가

이미

먼저 폐쇄해야하지만이 연결 과 관련된 열린 DataReader가 있습니다 얻고 난 (잠금을 사용하는 경우 정적 객체에서) 업데이트가 매우 느립니다.

누구든지이 문제를 해결할 수 있도록 도와 줄 수 있습니까?

답변

5

응용 프로그램에서 사용중인 각 명령 객체는 자신의 연결 객체 여야하며 명령을 실행하기 직전에 열고 즉시 닫아야합니다. (using 문으로 감싸는 것이 좋습니다.)

실제 기본 연결을 처리하기 위해 연결 풀링 기술을 신뢰합니다. 이렇게하면 여러 스레드가 동일한 연결에서 동시에 여러 명령을 실행하지 못하게됩니다 (보고있는 오류가 무엇인지).

스레드간에 공유되어야하는 유일한 것은 연결 문자열입니다.

+0

답장을 보내 주셔서 감사합니다. 다른 스레드에 대해 다른 연결을 사용하고 문제점이 해결되었습니다. – json

5

DataReader가 연결을 사용하기 전에 닫혀 있는지 확인하십시오. 내가 제안 할 것은 스레드간에 연결을 공유하지 않도록 코드를 리팩터링하는 것입니다. 당신이 달성하고자하는 것에 대해 더 많은 정보를 제공 할 수 있다면 유용한 코드 샘플을 제공 할 수있을 것입니다.

+0

대기열에서 메시지를 읽는 중 5 개의 스레드가 있고 해당 메시지의 상태를 DB로 업데이트하려고합니다. 아래 코드는 내 스레드가 호출하는 코드입니다. – json

0

동일한 연결에서 동시에 여러 개의 DataReader를 열 때 발생합니다. 즉, SqlCommand.ExecuteReader를 호출했지만이 메서드에서 반환 된 SqlDataReader를 다시 호출하기 전에 닫지 마십시오 (동일한 명령 또는 다른 명령에서 동일한 연결).
또한 시도해보십시오 :
MultipleActiveResultSets=True 연결 고리.

관련 문제