2011-09-06 2 views
4

현재 WCF 웹 서비스를 만들고 있습니다.SqlConnection/SqlCommand 스레드가 안전합니까?

불행하게도 꽤 많은 계산이 필요하지만, 이러한 계산은 웹 서비스에 대한 호출간에 다르게 공유 될 수 있습니다. 실제로 - 계산을 한 번만 수행하면 나중에 모든 호출이 이점을 얻을 수 있습니다.

그러나 WCF에는 공유 응용 프로그램 상태가 없으므로 단일 인스턴스 모드에서 WCF를 설정하는 것이 논리적 인 것처럼 보입니다. 그러나

, 내가 보안 코드에 익숙하지 않다 (각 클라이언트는 당 serssion 확인, 또는 당 호출지지 할 수없는 것입니다 수 을 다시 계산하라고 강요, 모든 동반 할 가능성에 계산의 일부를 필요) 여러 스레드의 경우. 필자는 그 중 일부를 읽었으며 WCF 코드 중 하나도 공유 상태 (쓰기 쉽지 않은 계산 비트 제외)로 쓰지 않으므로 아무 것도 변경할 필요가 거의 없다고 확신합니다.

SqlConnection과 SqlCommand를 사용하여 백엔드와 통신하기 때문에 스레드 안전성을 믿을 수 있을지 잘 모르겠습니다.

편집 : 명령/연결이 항상 메소드에 대해 로컬임을 분명히해야합니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx 말한다 : "(Visual Basic의 경우 Shared) 멤버 모든 공용 static 내가 MSDN에서하는 SqlCommand 클래스를 보았다

using sqlConn = new SqlConnection(...) { 
try { 
    sqlConn.Open() 
} catch() { 
    throw new FaultException(); 
} 
var cmd = new SqlCommand("Some SQL", sqlConn); 
var reader = cmd.ExecuteReader(); 
//Read the stuff 
reader.Close(); 
//Return something 
} 

최종 편집 : 우리의 정맥 패턴을 이야기하고 모든 유형의 인스턴스 멤버는 스레드 안전성이 보장되지 않습니다. "

MS가 이 아니란 것을 올바르게 생각한다고 생각하면은 다중 스레드 시나리오에서 SqlCommand가 작동한다는 것을 보장합니까?

그렇지 않은 경우 스레드로부터 안전한 대안이 있습니까?

예, 난 그냥 내 웹 서비스의 모든 데이터베이스 액세스 방법을 잠글 수 있지만) 그것은 추한하고 필요는 없습니다 경우 b)는 내가 사전에

건배 :) 필요가 없었어요 원합니다!

+0

스레드간에 동일한 인스턴스를 공유하지 않고 클래스의 정적 부분이 스레드 안전성이면 문제가없는 것입니다. –

+1

스레드간에 이러한 인스턴스를 공유하지 말고 열어서 쿼리를 실행하고 처리하십시오. 최대한 빨리. 연결 풀링은 연결 최적화를 처리합니다. – TheCodeKing

답변

8

MS가 SqlCommand가 다중 스레드 시나리오에서 작동한다는 것을 보증하지 않는다는 것을 의미하는 것으로 올바르게 해석합니까?

올바르게 사용하는 한 멀티 스레드 시나리오에서는 정상적으로 작동합니다.

여러 스레드에서 Same SqlCommand를 사용하려고 시도하면 어떻게 될 것이라고 생각하십니까? 어떻게 작동할까요?

그러나 서로 다른 연결을 사용하는 스레드가 동일한 데이터베이스에 대해 다른 명령을 실행하면 문제가 없습니다.

MSDN의 스레드 안전성에 대한 참고 사항은 실제로 손상되어 심하게 말로 표현되어 스레드 안전성이 무엇인지 모르는 사람이 작성해야합니다. 입니다.

MSDN에서 설명하는 클래스 및 기능의 99.9 %에 해당 메시지와 함께 말하고자하는 것은 "이 유형의 정적 메서드는 여러 스레드에서 동시에 안전하게 호출 할 수 있습니다. 모든 인스턴스 같은 스레드 에있는은 여러 스레드가 동시에 호출해도 다른 개체의 동일한 멤버에 액세스하는 것이 안전하다고 보장 할 수 없습니다. "

+0

동의 함 - Same SqlCommand를 사용하는 여러 스레드가 절대로 작동하지 않을 것입니다. 내가 확신하지 못했던 것은, "다른 연결을 사용하는 다른 스레드가 동일한 데이터베이스에 다른 명령을 실행"하는 것이 안전한지 여부입니다. 기본적으로 SqlCommand에는 문제가되는 내부의 정적 인 정적 인 상태가 없다는 것을 어떻게 알 수 있습니까? 이 글을 쓰는 것조차도, 나는 어리석은 소리가 나는 것을 깨닫는다. 그러나 ... 당신의 대답에 감사드립니다! 내 코드는 괜찮을거야 :-) – Fafnr

2

SqlCommand와 동시에 수행하려는 작업이 무엇인지 확신 할 수는 없지만 SqlCommand를 사용하면 상태를 유지 관리해야하기 때문에 내부 스레드 안전성이 무엇이든 확실하게 문제가 발생할 수 있습니다.

동일한 명령을 여러 스레드에서 공유하려는 경우 사용하는 동안 무언가를 잠글 수 있습니다.

SqlConnection이 실행되는 한, 한 번에 하나의 쿼리 만 열 수 있으므로 DataReaders를 사용하는 경우 다시 한 번 뭔가를 잠 가야합니다. 여러 항목을 동시에 실행하려면 여러 연결/명령을 사용해야합니다.

WCF에 공유 응용 프로그램 상태가 없다는 것을 알았는지 확실하지 않습니다. 이는 반드시 필요한 것은 아니며, WCF 응용 프로그램을 호스팅하는 방법에 따라 다릅니다.aspNetCompatibilityEnabled="true"으로 IIS에서 호스팅되는 WCF 서비스 인 경우에도 웹 사이트에서 얻을 수있는 Application 개체가 남아 있습니다. aspNetCompatibility도 사용하지 않는 경우 다른 옵션이 있습니다.

+0

나는 꽤 명확하지 않다는 것을 깨달았 기 때문에, 나는 단지 내가하려고하는 것에 대한 예제로 업데이트했다 ... 나는 메소드 호출 사이에 명령/연결을 공유하지 않는다. 나는 항상 각 방법에서 명령/연결을 새로 만든다. 내가 확신 할 수없는 것은 내부적으로 나를 엉덩이에 물릴 수있는 구조가 있는지 아닌지입니다. 나는 aspNetCompatibilityEnabled에 대해 몰랐다. - 고마워! 나는 이것을 구조화하는 현명한 방법에 대해 확신이 없으며 때로는이 물건을 오랫동안 사용해온 사람들에게 물건을 던져 줄 수 있습니다. – Fafnr

2

단지 하나의 스레드에서 연결 및 명령을 사용하고 해당 스레드에 응용 프로그램 수준 스레드 문제를 신경 쓰지 않습니다. SQL Server는 코드를 잠그지 않아도 동시성을 처리 할만큼 충분히 좋습니다. 닷넷 연결 풀은 또한 유효한 연결을 빠르게 검색 할 수 있습니다.

당신이 만든 WCF 레이어 전체가 스레드를 돌보아야한다고 말하는 것은 아니지만 DAL은 .net 잠금이 아닌 db 잠금에 의존해야합니다.

관련 문제