2009-03-13 3 views
2

나는 스레드 풀을 사용하여 무거운 프로세싱과 SQL의 비트도 수행합니다. 현재 SQL 연결을 필요로 할 때 열어 쿼리를 실행 한 다음 닫습니다. 이것은 잘 작동합니다. 응용 프로그램이 아무 문제없이 실행되었습니다. 이 응용 프로그램이 더 많은 작업을 수행함에 따라 더 많은 스레드가 사용됩니다. 스레드가 많으면 SQL 연결을 더 많이 열고 닫을 수 있습니다. SQL 2005에서는 실제로 서버를 해머합니다. 내 테스트 서버는 약 175 회의 트랜잭션을 수행 중입니다. 약 150 개가 master 데이터베이스에서 실행되며 "ValidateSQLLogin"입니다.스레드 안전성에 대한 질문

각 스레드마다 자체 연결이 있고이 연결이 스레드 주위로 전달되도록 앱을 변경하려고합니다.

그래서 내 질문은 : SQL 연결 개체가 스레드에 로컬로 생성 한 다음이 안전하지 않은 것 또 다른 클래스의 정적 기능에 심판에 의해 전달되는

경우?

void ThreadA() 
{ 
    SqlConnection a = new SqlConnection(....); 
    MyStaticClass.DoStuff(ref a); 
} 

void ThreadB() 
{ 
    SqlConnection b = new SqlConnection(....); 
    MyStaticClass.DoStuff(ref b); 
} 

static void MyStaticClass.DoStuff(ref SqlConnection sql) 
{ 
    // Do stuff with sql 
} 

내 초기 생각은 10 개 스레드가 모두 각각 자신의 연결 개체를 통과, 같은 시간에 같은 정적 함수를 호출 할 수 있기 때문에이 안전하지 않을 것입니다.

이전에는 정적 함수가 자체 연결을 열고 완료되면 닫았습니다.

안전하지 않은 경우이 문제를 해결하는 가장 좋은 방법은 무엇입니까? SQL 연결 열기/닫기를 최소화하고 최소화해야합니다.

감사

답변

5

정적 함수에 대한 파라미터는 정적 필드와 동일하지 않다. 정적 함수를 실행할 때마다 다른 연결 사본이 사용됩니다. 매개 변수를 참조로 가질 필요조차 없습니다 (참조 매개 변수는 변경하려는 경우에만 필요합니다).

+1

동일한 연결을 공유하면 다음과 같은 질문이 제기됩니다. 연결이 유효하지 않으면 어떻게 복구합니까? – lsalamon

2

각 스레드는 자체 스택을 가지고 있으며 매개 변수와 지역 변수가 스택에 저장되므로 여러 개의 스레드에서 동일한 정적 메서드를 호출해도 문제가 없습니다. 각 메서드 호출에는 자체 매개 변수와 로컬 변수가 있습니다.

SqlConnection을 전달할 이유가 없습니다.

0

다른 사람들에 의해 말했듯이, 여러 스레드에서 정적 메서드를 호출하는 것은 그 자체로 위험하지 않습니다. 그러나 정적 메서드가 전달하는 매개 변수로 작업하는 대신 정적 필드 *를 수정하거나 액세스하는 경우 스레드로부터 안전하게 보호해야합니다.

  • 예외 : 일부 값 유형은 액세스/쓰기에 원자 적 연산을 사용하며 암시 적으로 해당 연산에 대해 스레드로부터 안전합니다. 그러나 경쟁 조건을 검색하고 업데이트하는 논리에서는 여전히 경쟁 조건이 발생할 수 있습니다.
-2

.Net 모든 정적 멤버는 스레드로부터 안전합니다.

0

로드가 많은 경우 하나의 정적 연결을 유지하는 것이 좋습니다.이 트랜잭션은 사용자가이 트랜잭션을 수행하는 동안 열어두고로드가 크게 줄어들거나 null 인 경우 자동으로 닫히고 새 요청이 열립니다 다시.

0

는 다음과 같은 시도 :이 연결을 사용하는 경우

당신은 코드 블록에 들어가는 다른 스레드를 방지하기 위해 lock 문을 사용할 수 있습니다, 다른 스레드는 이전 스레드가 완료 될 때까지 자동으로 대기하고이 입력된다 분절. 잠그고있는 객체가 정적 클래스에 비공개인지 확인하십시오.

관련 문제