2014-02-12 2 views
7

Google에서 내 문제를 검색했지만 이에 대한 해결책을 찾지 못했습니다.SqlConnection 스레드로부터 안전한가요?

Windows 저널과 SQL 테이블에 로그를 저장하는 로그 클래스가 있습니다. 내 코드를 최적화하기 위해 하나의 SqlConnection 만 사용하고 싶습니다.

MSDN에서이 유형의 모든 공용 정적 (Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버가 스레드로부터 안전하다는 보장은 없습니다.

내 질문은 : 그것은 스레드 안전

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

입니까? 그렇다면 Open() 및 Close()를 사용할 때?

아니요, 그렇다면 어떻게 적절하게 사용합니까?

은 여기 내 전체 클래스 코드 : 사전에

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) 
{ 
    // Windows Logs 
    if (ConfigParameters.Instance.WindowsLog) 
     EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); 

    // SQL Logs 
    // TODO 

    return 0; 
} 

감사합니다 :) 그것은도록 SqlConnection을 공유 할 수있는 일반적인 방법이 아니다

+0

입니다. codeproject.com/Articles/62249/Connection-Pooling-in-multithreaded-applications 해결책이 될 수 있습니까? – BaptX

+1

왜 하나의 연결 만 사용 하시겠습니까? 스레딩 문제를 방지하기 위해 오버 헤드가 증가합니다. ADO.NET에는 이미 연결 풀링 기능이 내장되어 있으므로 '연결 사용'문에서 해당 연결을 사용하여 지정된 연결을 사용하는 시간을 최소화 할 수 있습니다. – Tim

+0

또한 WCF와 관련이 없으므로 해당 태그를 제거 할 수 있습니다. – Tim

답변

12

, 그리고 특별 케이스를 사용하는 경우에만하에 사용되어야한다.

첫째, 당신은

그러나 특히도록 SqlConnection를 들어, 당신이없는

이 ... 리소스 풀링 소켓, 네트워크 스트림, 웹 서비스로 작업 할 때 성능을 향상시키기 위해 사용되는 일반적인 패턴이 것이 사실 걱정하고 이것에 대해 프레임 워크가 이미 Sql Connection Pool 덕분에이 작업을 수행했기 때문입니다.

사용자가 연결에서 열기를 호출 할 때마다 풀러는 풀에서 사용 가능한 연결을 찾습니다. 풀링 된 연결을 사용할 수있는 경우 새 연결을 여는 대신 호출자에게 연결을 반환합니다. 응용 프로그램이 연결에서 Close를 호출하면 풀러는 을 풀링하는 대신 풀링 된 활성 연결 집합에 반환합니다. 연결이 풀로 반환됩니다 되면, 당신은 실제 연결 래퍼로서도록 SqlConnection을 고려할 수

다음 열기 호출에 재사용 할 준비가되어 있습니다. 새로운 SqlConnection을 설치하는 것이 값 비싸다는 사실을 깨닫지 마십시오. 높은 트래픽을 가진 많은 웹 사이트가 구축되어 있지 않습니다.

SQL Server의 기본 전략은 자동으로 작동한다는 것입니다. 연결을 닫는 것에 대해 알고 있어야합니다 (사용 블록 사용). 또한 풀을 관리하는 많은 설정이 있습니다.

당신의 코드는 잘못된 오류 관리가 포함되어 연결이 중단되는 경우 로그인 할 때 (DBA가, 네트워크 장애, ...) 당신은 내가 '돈이 끝에되지 이상적인

... 예외를 던질 것이다 귀하의 경우에는 SQL 연결 공유가 적절하다고 생각하지 마십시오. 비동기 로깅 라이브러리를 사용하면 훨씬 더 많은 성능을 얻을 수 있습니다.

실제 문제가 될 때까지 지금은 집중하지 마십시오.우리는 작은 효율성에 대해 잊지한다

은 약 97 % 시간의 말 : HTTP : // WWW 조기 최적화 내가 이걸 발견 모든 악의 뿌리, 도널드 크 누스

+0

메서드에 SqlConnection 넣기 :) – BaptX

관련 문제