ODBC 드라이버에서 커넥트ion-Pool 인식 개발
이 항목에서는 드라이버가 연결 풀링 서비스를 제공하는 방법에 대한 정보를 포함하는 ODBC 드라이버를 개발하는 방법에 대해 자세히 설명합니다.
드라이버 인식 커넥트ion 풀링 사용
드라이버는 다음 ODBC SPI(서비스 공급자 인터페이스) 함수를 구현해야 합니다.
SQLSet커넥트AttrForDbcInfo
SQLSet커넥트Info
SQLSetDriver커넥트Info
SQLGetPoolID
SQLRate커넥트ion
SQLPool커넥트
SQLCleanup커넥트ionPoolID
자세한 내용은 ODBC SPI(서비스 공급자 인터페이스) 참조를 참조하세요.
또한 드라이버는 드라이버 인식 풀링을 사용하도록 설정할 수 있도록 다음과 같은 기존 함수를 구현해야 합니다.
함수 | 추가된 기능 |
---|---|
SQLAllocHandle SQLFreeHandle SQLGetDiagField SQLGetDiagRec |
새 핸들 유형인 SQL_HANDLE_DBC_INFO_TOKEN 지원합니다(아래 설명 참조). |
SQLSet커넥트Attr | 새 집합 전용 연결 특성을 지원합니다. SQL_ATTR_DBC_INFO_TOKEN 연결을 다시 설정합니다(아래 설명 참조). |
참고 항목
SQLError 및 SQLSet커넥트Option과 같은 사용되지 않는 함수는 드라이버 인식 연결 풀링에 지원되지 않습니다.
풀 ID
풀 ID는 서로 바꿔 사용할 수 있는 특정 연결 그룹을 나타내는 포인터 길이 드라이버별 ID입니다. 연결 정보 집합이 제공되면 드라이버는 해당 풀 ID를 신속하게 추론할 수 있어야 합니다.
예를 들어 풀 ID는 서버 이름과 자격 증명 정보를 인코딩해야 합니다. 그러나 드라이버가 연결을 다시 사용한 다음 새 연결을 만드는 것보다 더 적은 시간 안에 데이터베이스를 변경할 수 있으므로 데이터베이스 이름이 필요하지 않습니다.
드라이버는 풀 ID를 구성하는 키 특성 집합을 정의해야 합니다. 이러한 키 특성의 값은 연결 특성, 연결 문자열 및 DSN에서 올 수 있습니다. 이러한 원본에 충돌이 있는 경우 이전 버전과의 호환성을 위해 기존 드라이버별 해결 정책을 사용해야 합니다.
드라이버 관리자는 다른 풀 ID에 대해 다른 풀을 사용합니다. 동일한 풀의 모든 연결을 다시 사용할 수 있습니다. 드라이버 관리자는 다른 풀 ID로 연결을 다시 사용할 수 없습니다.
따라서 드라이버는 정의된 키 특성에서 동일한 값을 가진 모든 연결 그룹에 대해 고유한 풀 ID를 할당해야 합니다. 드라이버가 키 특성에서 서로 다른 값을 가진 두 연결에 동일한 풀 ID를 사용하는 경우 드라이버 관리자는 여전히 동일한 풀에 배치됩니다(드라이버 관리자는 드라이버별 키 특성에 대해 아무것도 알지 못). 즉, 드라이버는 SQLRate커넥트ion 함수 내에서 다른 키 특성 집합과의 연결을 다시 사용할 수 없다는 것을 드라이버 관리자에 보고해야 합니다. 이렇게 하면 성능이 저하되고 권장되지 않습니다.
드라이버 관리자는 모든 연결 정보가 일치하는 경우에도 다른 드라이버 환경에서 할당된 연결을 다시 사용하지 않습니다. 드라이버 관리자는 연결에 동일한 풀 ID가 있는 경우에도 다른 환경에 다른 풀을 사용합니다. 따라서 풀 ID는 해당 드라이버 환경에 로컬입니다.
드라이버에서 풀 ID를 가져오는 함수는 SQLGetPoolID 함수입니다.
커넥트온 등급
새 연결을 설정하는 것에 비해 풀링된 연결에서 일부 연결 정보(예: DATABASE)를 다시 설정하여 성능을 높일 수 있습니다. 따라서 데이터베이스 이름이 키 특성 집합에 포함되지 않도록 할 수 있습니다. 그렇지 않으면 고객이 다양한 연결 문자열 사용하는 중간 계층 애플리케이션에서 좋지 않을 수 있는 각 데이터베이스에 대해 별도의 풀을 가질 수 있습니다.
일부 특성이 일치하지 않는 연결을 다시 사용할 때마다 반환된 연결이 애플리케이션 요청과 동일하도록 새 애플리케이션 요청에 따라 일치하지 않는 특성을 다시 설정해야 합니다(SQLSet의 특성 SQL_ATTR_DBC_INFO_TOKEN 설명 참조커넥트Attr 함수). 그러나 이러한 특성을 다시 설정하면 성능이 저하됩니다. 예를 들어 데이터베이스를 다시 설정하려면 서버에 대한 네트워크 호출이 필요합니다. 따라서 사용할 수 있는 경우 완벽하게 일치하는 연결을 다시 사용합니다.
드라이버의 등급 함수는 새 연결 요청을 사용하여 기존 연결을 평가할 수 있습니다. 예를 들어 드라이버의 등급 함수는 다음을 결정할 수 있습니다.
기존 연결이 요청과 완벽하게 일치하는 경우
서버와의 통신이 다시 설정되지 않아도 되는 연결 시간 제한과 같은 몇 가지 사소한 불일치만 있는 경우
다시 설정하기 위해 서버와의 통신이 필요하지만 새 연결을 설정하는 것보다 성능이 향상되는 일부 일치하지 않는 특성이 있는 경우
다시 설정하는 데 시간이 많이 걸리는 특성에 대해 불일치가 발생한 경우(드라이버 개발자는 풀 ID를 생성하는 데 사용되는 키 특성 집합에 이 특성을 추가하는 것을 고려할 수 있습니다).
0에서 100 사이의 점수가 가능합니다. 여기서 0은 재사용하지 않고 100은 완벽하게 일치한다는 의미입니다. SQLRate커넥트ion은 연결 등급을 지정하는 함수입니다.
새 ODBC 핸들 - SQL_HANDLE_DBC_INFO_TOKEN
드라이버 인식 연결 풀링을 지원하려면 드라이버가 풀 ID를 계산하기 위해 연결 정보가 필요합니다. 또한 드라이버는 풀의 연결과 새 연결 요청을 비교하기 위해 연결 정보가 필요합니다. 풀에서 연결을 다시 사용할 수 없을 때마다 드라이버는 새 연결을 설정해야 하므로 연결 정보가 필요합니다.
연결 정보는 여러 원본(연결 문자열, 연결 특성 및 DSN)에서 제공될 수 있으므로 드라이버는 연결 문자열 구문 분석하고 위의 각 함수 호출에서 이러한 원본 간의 충돌을 해결해야 할 수 있습니다.
따라서 SQL_HANDLE_DBC_INFO_TOKEN 새 ODBC 핸들이 도입됩니다. SQL_HANDLE_DBC_INFO_TOKEN 경우 드라이버는 연결 문자열 구문 분석하고 연결 정보의 충돌을 두 번 이상 해결할 필요가 없습니다. 드라이버별 데이터 구조이므로 드라이버는 연결 정보 또는 풀 ID와 같은 데이터를 저장할 수 있습니다.
이 핸들은 드라이버 관리자와 드라이버 사이의 인터페이스로만 사용됩니다. 애플리케이션에서 이 핸들을 직접 할당할 수 없습니다.
이 핸들의 부모 핸들은 SQL_HANDLE_ENV 형식이므로 연결 정보 확인 중에 드라이버가 HENV 핸들에서 환경 정보를 가져올 수 있습니다.
드라이버 관리자는 새 연결 요청을 받을 때마다 드라이버가 연결 풀 인식을 지원하는지 확인한 후 연결 정보를 저장하기 위한 SQL_HANDLE_DBC_INFO_TOKEN 형식의 핸들을 할당합니다. 핸들 사용을 마쳤지만 SQLDriver커넥트 또는 SQL커넥트 SQL_STILL_EXECUTING 이외의 일부 반환 코드를 반환하기 전에 드라이버 관리자가 핸들을 해제합니다. 따라서 핸들은 SQLAllocHandle 호출 후에 만들어지고 SQLFreeHandle 호출 후에 제거됩니다. 드라이버 관리자는 연결된 HENV를 해제하기 전에 핸들이 해제되도록 보장합니다(SQLDriver커넥트 또는 SQL커넥트에서 오류를 반환하는 경우).
드라이버는 새 핸들 형식 SQL_HANDLE_DBC_INFO_TOKEN 허용하도록 다음 함수를 수정해야 합니다.
드라이버 관리자는 여러 스레드가 동일한 SQL_HANDLE_DBC_INFO_TOKEN 핸들을 동시에 사용하지 않도록 보장합니다. 따라서 이 핸들의 동기화 모델은 드라이버 내에서 매우 간단할 수 있습니다. 드라이버 관리자는 SQL_HANDLE_DBC_INFO_TOKEN 할당하고 해제하기 전에 환경 잠금을 사용하지 않습니다.
드라이버 관리자의 SQLAllocHandle 및 SQLFreeHandle 은 이 새 핸들 형식을 허용하지 않습니다.
SQL_HANDLE_DBC_INFO_TOKEN 자격 증명과 같은 기밀 정보를 포함할 수 있습니다. 따라서 드라이버는 SQLFreeHandle을 사용하여 이 핸들을 해제하기 전에 중요한 정보가 포함된 메모리 버퍼(SecureZeroMemory 사용)를 안전하게 지워야 합니다. 애플리케이션의 환경 핸들이 닫혀 있을 때마다 연결된 모든 연결 풀이 닫힙니다.
드라이버 관리자 커넥트ion 풀 등급 알고리즘
이 섹션에서는 드라이버 관리자 연결 풀링에 대한 등급 알고리즘에 대해 설명합니다. 드라이버 개발자는 이전 버전과의 호환성을 위해 동일한 알고리즘을 구현할 수 있습니다. 이 알고리즘은 최상의 알고리즘이 아닐 수 있습니다. 구현을 기반으로 이 알고리즘을 구체화해야 합니다(그렇지 않으면 이 기능을 구현할 이유가 없음).
드라이버 관리자는 풀의 각 연결에 대해 0에서 100까지의 정수 등급을 반환합니다. 0은 연결을 다시 사용할 수 없으며 100은 완벽하게 일치됨을 나타냅니다. 연결 요청의 이름이 hRequest이고 풀의 기존 연결 이름이 hCandidate라고 가정합니다. 다음 조건 중 하나가 false이면 hRequest에 풀된 연결 hCandidate를 다시 사용할 수 없습니다(드라이버 관리자는 0의 등급을 할당합니다).
hCandidate 및 hRequest는 모두 유니코드 API(예: SQLDriver커넥트W) 또는 ANSI API(예: SQLDriver커넥트A)에서 제공됩니다. (UNICODE 드라이버는 ANSI API 및 UNICODE API에 따라 다르게 동작할 수 있습니다(SQL_ATTR_ANSI_APP 연결 특성 참조).
hCandidate 및 hRequest는 동일한 함수에 의해 생성됩니다. SQLDriver커넥트 또는 SQL커넥트.
hCandidate를 여는 데 사용되는 연결 문자열 SQLDriver커넥트 사용되는 경우 hRequest와 동일해야 합니다.
HCandidate를 여는 데 사용되는 ServerName(또는 DSN), 사용자 이름 및 암호는 SQL커넥트 사용할 때 hRequest를 여는 데 사용되는 것과 동일해야 합니다.
현재 스레드의 SID(보안 식별자)는 hCandidate를 여는 데 사용되는 SID와 동일해야 합니다.
등록 및 등록 취소에 비용이 많이 드는 드라이버의 경우(SQL에서 SQL_DTC_TRANSITION_COST 설명 참조커넥트) hRequest를 다시 사용하려면 추가 인리스트먼트 또는 등록 취소가 필요하지 않아야 합니다.
다음 표에서는 다양한 시나리오에 대한 점수 할당을 보여 줍니다.
풀된 연결과 요청 간의 연결 특성 비교 | 인리스트먼트 없음/등록 취소 | 추가 인리스트먼트 필요/등록 취소 |
---|---|---|
카탈로그(SQL_ATTR_CURRENT_CATALOG)가 다릅니다. | 60 | 50 |
일부 연결 특성은 다르지만 카탈로그는 동일합니다. | 90 | 70 |
모든 연결 특성이 완벽하게 일치 | 100 | 80 |
시퀀스 다이어그램
이 시퀀스 다이어그램은 이 항목에 설명된 기본 풀링 메커니즘을 보여줍니다. SQLDriver의 사용만 보여 주지만커넥트 SQL커넥트 사례는 비슷합니다.
상태 다이어그램
이 상태 다이어그램은 이 항목에 설명된 연결 정보 토큰 개체를 보여 줍니다. 다이어그램은 SQLDriver만 표시하지만커넥트 SQL커넥트 사례는 비슷합니다. 드라이버 관리자는 언제든지 오류를 처리해야 할 수 있으므로 드라이버 관리자는 모든 상태에 대해 SQLFreeHandle을 호출할 수 있습니다.