현재 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)는 내가 사전에
건배 :) 필요가 없었어요 원합니다!
스레드간에 동일한 인스턴스를 공유하지 않고 클래스의 정적 부분이 스레드 안전성이면 문제가없는 것입니다. –
스레드간에 이러한 인스턴스를 공유하지 말고 열어서 쿼리를 실행하고 처리하십시오. 최대한 빨리. 연결 풀링은 연결 최적화를 처리합니다. – TheCodeKing