Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  OLE DB에 대한 Connection Pooling에 관하여 
작성일시 : 2010. 2. 21. 00:11 | 분류 : SQL Server/Development

커넥션 풀링을 사용하는 경우 (커넥션을 Close 한 이후에 사용 하는 경우)
1. 동일 프로세스에 동일한 Connection String을 가지고 있으며, SPTimeout / Wait Retry (이 후 설명) 안에서 실행 되는 경우
예) 아래의 경우 해당 객체를 close 한 경우에도 다른 객체로 동일한 Connection String 을 이용하여 연결한 경우 입니다.
image

위의 경우 sp_reset_connection 를 통해 이전 연결 설정을 재 사용함을 확인 할 수 있습니다.

커넥션 풀링을 사용하지 않는 경우
1. 동일한 프로세스가 아닌 경우
2. Connection String 이 다른 경우
3. 연결 객체 종료 (Close) 이후 SPTimeout / Wait Retry 의 기본 값 60초가 지난 경우
예)
아래는 동일 프로세스에 사용자 입력을 기다리는 형태로 구성되어 있습니다.
보는것과 같이 SPID가 54 입니다.
image
사용자 입력을 대기하도록 했습니다. 보는것과 같이 1분이 넘었습니다.
(아 Audit Logout 이벤트는 쿼리 성능과 관계없이 App에서 홀딩한 시간도 측정하는군요.)
image 

아 sp_reset_connection 이 실행 되지 않고 있음을 확인 할 수 있습니다.
다시 말해서 풀링을 사용하고 있지 않다는 말이군요.
image

SPTimeout / Wait Retry 시간 조정

먼저 각 드라이버 별로 SPTimeout 값을 늘려줄 수 도 있습니다. 해당 레지스트리 아래에 SPTimeout 값을 늘려주면 됩니다.
SQLOLEDB (SQL Server native provider) : HKEY_CLASSES_ROOT\CLSID\{0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}
Microsoft.Jet.OLEDB.4.0 (Jet native provider) ": HKEY_CLASSES_ROOT\CLSID\{dee35070-506b-11cf-b1aa-00aa00b8de95}
MSDAORA (Oracle native provider) : HKEY_CLASSES_ROOT\CLSID\{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d} MSDASQL (OLE DB Provider for ODBC) : HKEY_CLASSES_ROOT\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}

Wait Retry 의 경우 이 대기 시간의 전역 설정이라고 볼 수 있습니다.
아래의 값을 조정하게 되면 전체적으로 대기 하는 시간을 늘려 줄 수 있습니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess\Session Pooling\Retry Wait
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess\Session Pooling\ExpBackOff

커넥션 풀링 이용하기
1. Connection String에 OLE DB Services = –1 값을 추가 합니다. (의미는 아래 표를 참고 합니다.)
예)
string source = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=TEST;" +
            "UID=sa;PWD=pass1234;" +
            "OLE DB Services = -1;";

image

2. OLEDB Driver 의 OLEDB_SERVICES 를 0xffffffff 로 수정합니다. (의미는 아래 표를 참고 합니다.)
예)
image

image

-- 실제로는 해당 이벤트 확인이 않됩니다.
이는 EventSubClass 를 통해서 Connection 의 Pooling 여부를 확인 할 수 있다고 하는데, 실제로는 않되네요…;;
그림 출처 : http://weblogs.sqlteam.com/billg/archive/2007/10/31/Login-Events-include-Pooled-Connections.aspx

image 

참고 문서
http://blogs.msdn.com/selvar/archive/2007/11/10/ole-db-resource-pooling.aspx
http://msdn.microsoft.com/en-us/library/ms810829.aspx
http://support.microsoft.com/kb/237977

|