COM+ 리소스 디스펜서 개념

애플리케이션 구성 요소는 COM+ 리소스 디스펜서를 사용하여 구성 요소와 지정된 리소스 관리자 간의 연결과 같은 공유되고 대체 불가능한 상태 정보에 액세스하고 관리합니다. 런타임에 데이터베이스 연결, 네트워크 연결, 큐에 대한 연결, 스레드, 개체 및 메모리 블록과 같은 동적 리소스 풀을 리소스 디스펜서에서 사용할 수 있습니다. 애플리케이션 프로세스는 자주 사용하는 리소스의 최소 수를 사용하여 고성능을 달성합니다. 리소스 디스펜서는 트랜잭션 및 매립을 자동화할 수도 있습니다. 이 기능에 대한 자세한 내용은 자동 리소스 매립 을 참조하세요.

참고

리소스는 리소스 디스펜서가 만드는 모든 항목입니다. 예를 들어 리소스 관리자에 대한 연결은 일반적인 리소스입니다. 리소스는 리소스 디스펜서의 메모리에 있으며 디스펜서 관리자에 복사되지 않습니다. 리소스는 불투명 핸들(RESID)에서만 알려져 있으며 트랜잭션을 수행할 수 있거나 수행할 수 없을 수 있습니다. 관리되는 리소스는 지속성 상태를 관리하는 구성 요소에 대한 연결일 수 있지만 연결 자체는 지속성이 없습니다. 리소스 디스펜서는 종종 관련 리소스 관리자를 사용하여 지속성 상태를 유지합니다.

 

아키텍처적으로 COM+ 리소스 디스펜서 시스템은 리소스 디스펜서와 디스펜서 관리자로 구성됩니다. 리소스 디스펜서는 애플리케이션에 공유 리소스에 대한 간단한 인터페이스를 제공하는 사용자 제공 구성 요소입니다. 디스펜서 관리자는 다양한 리소스 디스펜서의 활동을 조정하는 COM+에서 제공하는 구성 요소입니다.

리소스 디스펜서는 두 개 이상의 인터페이스를 제공하는 DLL(동적 연결 라이브러리) 구성 요소입니다. 첫 번째 IDispenserDriver는 관리되는 리소스를 만들고, 삭제하고, 등록하는 방법에 대한 기본 정보를 디스펜서 관리자에게 제공합니다. 두 번째는 애플리케이션에 노출되며 COM 인터페이스 또는 인터페이스 집합이거나 가져오기 라이브러리를 통해 구성 요소가 연결된 API(애플리케이션 프로그래밍 인터페이스)일 수 있습니다. 애플리케이션은 모든 리소스 디스펜서를 호출할 수 있으며, 그러면 애플리케이션에 API를 제공할 수 있습니다. 리소스 디스펜서가 Automation 구성 요소인 경우 Microsoft Visual Basic에서 액세스할 수 있습니다. 리소스 디스펜서는 애플리케이션 구성 요소가 참조할 때 인스턴스화됩니다.

COM+에서 제공하는 디스펜서 관리자는 리소스 디스펜서 및 좌표를 추적합니다. IDispenserManager 및 IHolder라는 두 가지 인터페이스를 구현합니다. 리소스 디스펜서는 IDispenserManager 인터페이스를 사용하여 등록합니다. 그런 다음 디스펜서 관리자는 디스펜서 관리자에게 활동을 알리는 데 사용하는 IHolder 에 대한 포인터를 제공합니다.

트랜잭션 리소스 디스펜서는 DTC(Distributed Transaction Coordinator) 트랜잭션에 참여해야 합니다. 이는 OLE 트랜잭션 규격인 내부 또는 외부(리소스 디스펜서) 리소스 관리자를 사용하는 것을 의미합니다.

참고

COM+ 프로그래밍 모델에는 선언적 트랜잭션이 포함되어 있어 수명 동안 애플리케이션 개체가 수행하는 작업을 보호할 수 있습니다. 애플리케이션 개체가 COM+ 리소스 디스펜서를 사용하는 경우 수행하는 작업은 자동으로 트랜잭션입니다. 즉, 구성 요소는 트랜잭션을 명시적으로 선언할 필요가 없습니다. 이러한 트랜잭션은 OLE 트랜잭션 사양에 정의되고, DTC에서 구현되며, COM+에 의해 애플리케이션 개체를 대신하여 시작됩니다. 자세한 내용은 DTC 개발 가이드를 참조하세요.

 

리소스는 트랜잭션일 필요가 없습니다. 비 트랜잭션 리소스를 풀링하는 리소스 디스펜서는 애플리케이션 개체가 이러한 리소스의 공유 풀에 액세스할 수 있도록 하여 여전히 고성능을 달성할 수 있습니다. 이 유형의 리소스 디스펜서는 IDispenserDriver::EnlistResource 메서드에서 S_FALSE 반환합니다. 즉, 리소스가 트랜잭션이 아니므로 리소스 디스펜서가 리소스를 등록하지 않았습니다.

리소스 디스펜서는 COM+에 독립적으로 작동하여 리소스 풀링 기능만 제공할 수 있습니다. 예를 들어 리소스 디스펜서가 API(예: ODBC)를 노출하는 경우 리소스 디스펜서는 가져오기 라이브러리(또는 LoadLibraryGetProcAddress 함수 사용)를 통해 애플리케이션에서 액세스하는 DLL일 수 있습니다. 리소스 디스펜서는 애플리케이션이 CoCreateInstance를 호출하여 액세스하는 COM 구성 요소일 수도 있습니다. COM+가 없으면 디스펜서 관리자가 현재 구성 요소 트랜잭션에 대한 지식이 없기 때문에 리소스 디스펜서의 EnlistResource 메서드를 호출할 수 없습니다.

시작 시 리소스 디스펜서 DLL은 디스펜서 관리자에 등록해야 합니다. 디스펜서 관리자는 리소스 디스펜서의 로드 및 언로드를 관리하고, COM+ 컨텍스트를 제공하고, 인벤토리 통계 관리자를 제어하는 제어 임원입니다. (자세한 내용은 COM+ 디스펜서 관리자를 참조하세요.) 리소스 디스펜서는 먼저 GetDispenserManager 함수를 호출한 다음 , IDispenserManager::RegisterDispenser 메서드를 호출하여 리소스 디스펜서가 구현하는 IDispenserDriver 포인터를 전달합니다. 이 호출은 IHolder에 대한 참조를 반환합니다.

종료하려면 리소스 디스펜서가 IHolder::Close를 호출합니다. 클린 패키지 종료를 보장하려면 COM+가 디스펜서에 종료를 요청한 후에도 리소스 디스펜서가 비즈니스 개체에서 호출이 계속 도착하는 상황을 처리할 수 있어야 합니다.

이 섹션의 다음 topics COM+ 리소스 디스펜서 서비스에 대한 자세한 정보를 제공합니다.

COM+ 리소스 디스펜서 작업