연결 핸들

연결 핸들은 실제 연결의 표시입니다. WebSphere® Application Server에서 백엔드 자원(예: 관계형 데이터베이스)을 사용하려면 해당 자원과 연결해야 합니다. getConnection() 메소드 호출 시, 연결 핸들이 리턴됩니다. 이 핸들은 실제 연결이 아닙니다. 연결 관리자가 실제 연결을 관리합니다.

연결 핸들의 사용 방법 및 작동 방식에 영향을 주는 두 가지 중요한 구성이 있습니다. 첫 번째는 데이터 소스 또는 연결 팩토리를 찾아보는 데 사용된 자원 참조로 정의되는 res-sharing-scope입니다. 이 특성은 연결 관리자에게 이 연결을 공유할 수 있는지 여부를 알려줍니다.

연결 핸들 작동에 영향을 주는 두 번째 요소는 사용법 패턴입니다. 기본적으로, 다음 두 가지 사용법 패턴이 있습니다. 첫 번째 패턴은 가져오기/사용/닫기입니다. 이 패턴은 동일한 데이터 소스 또는 연결 팩토리에서 연결을 가져올 수 있고 다른 메소드를 호출하지 않는 단일 메소드 내에서 사용됩니다. 이 패턴을 사용하는 애플리케이션은 다음과 같습니다.
  1. 연결 가져오기
  2. 작업 수행
  3. 커미트(적절할 경우)
  4. 연결 닫기
두 번째 사용법 패턴은 캐시된 핸들 패턴입니다. 이것은 애플리케이션이 다음을 수행하는 위치입니다.
  1. 연결 가져오기
  2. 글로벌 트랜잭션 시작
  3. 연결 작업 수행
  4. 글로벌 트랜잭션 커미트
  5. 재연결 작업 수행
캐시된 핸들은 애플리케이션에 의해 트랜잭션 및 메소드 경계에서 보류된 연결 핸들입니다. 캐시된 핸들을 사용하려면 다음 사항을 고려해야 합니다.
  • 캐시된 핸들 지원은 성능에 영향을 줄 수 있는 경계에서 일부 추가 연결 핸들 관리를 필요로 합니다. 예를 들어, JDBC 애플리케이션에서 Statements, PreparedStatements 및 ResultSets는 트랜잭션이 종료된 후에 잠재적으로 닫히나 연결은 여전히 유효합니다.
  • 공유 가능한 연결을 위한 트랜잭션 경계에서 연결을 캐시하지 않도록 해야 하며 가져오기/사용/닫기 패턴이 선호됩니다.
  • 서블릿 메소드를 넘나드는 연결 핸들의 캐싱은 JDBC와 JMS(Java™ Message Service) 자원에 한정되어 있습니다. 그 밖에 CICS®(Customer Information Control System)나 IMS™ 오브젝트와 같은 비관계형 자원은 연결 핸들을 서블릿에 캐시할 수 없습니다. 메소드를 호출할 때마다 연결 핸들을 가져오고 사용하고 닫아야 합니다. (이 제한은 다중 스레드 서블릿이 연결 핸들을 캐시할 수 없으므로 단일 스레드 서블릿에만 적용됩니다.)
  • 캐시된 연결 핸들을 데이터 액세스 클라이언트의 하나의 인스턴스에서 다른 클라이언트 인스턴스로 전달할 수 없습니다. 클라이언트 인스턴스 간의 전송을 수행하면 하나의 인스턴스가 다른 인스턴스에서 참조하는 연결 핸들을 사용하게 되는 뜻하지 않은 문제 상황이 발생합니다. 연결 핸들 관리 코드는 각 클라이언트 인스턴스에 대한 태스크를 개별적으로 처리하므로 이러한 관계는 문제점만 유발시키게 됩니다. 따라서 연결 핸들 전송을 수행하면 예외를 트리거하는 런타임 시나리오가 생성됩니다. 예를 들면, 다음과 같습니다.
    1. 전송된 핸들을 수신하는 클라이언트 인스턴스의 애플리케이션 코드가 핸들을 닫습니다.
    2. 핸들에 대한 원래 참조를 보유하는 클라이언트 인스턴스가 핸들을 수정하려고 시도하면 애플리케이션 서버가 예외를 발행합니다.

다음 코드 세그먼트에서는 캐시된 연결 패턴을 보여줍니다.

Connection conn = ds.getConnection();
ut.begin();
conn.prepareStatement("....."); // Connection runs in global transaction mode
...
ut.commit();
conn.prepareStatement("....."); // Connection still valid but runs in autoCommit(True);
...

공유 불가능한 연결

공유 불가능의 res-sharing-scope를 사용하여 검색한 연결 핸들의 일부 특성은 다음 절에 설명되어 있습니다.
  • 비공유 연결의 이점
    • 애플리케이션은 항상 실제 연결(관리 연결)로 직접 링크를 유지보수합니다.
    • 애플리케이션에서는 항상 연결 핸들과 관리 연결 사이에 일대일 관계가 성립합니다.
    • 대부분의 경우, 연결은 애플리케이션을 닫을 때까지 닫히지 않습니다.
    • 다중 트랜잭션에서 캐시된 비공유 연결 핸들을 사용할 수 있습니다.
    • 일부 캐시된 핸들 상황에서는 연결의 성능상 장점이 있을 수 있습니다. 비공유 연결은 트랜잭션 종료 시 관리 연결에서 연결 핸들을 분리하는 오버헤드를 갖지 않기 때문에, 캐시된 비공유 연결을 사용할 경우 적은 오버헤드가 발생합니다.
  • 비공유 연결의 가능한 결점
    • 연결 자원의 비효율적인 사용. 예를 들어, 단일 트랜잭션 내에서 동일한 데이터 소스 또는 연결 팩토리(동일한 resource-ref)를 사용하여 둘 이상의 연결(동일한 특성 보유)을 가져올 경우, 공유 불가능한 연결을 사용할 때 여러 개의 실제 연결을 사용합니다.
    • 연결 소모. 연결 핸들이 필요 이상으로 오래 열린 상태(즉, 애플리케이션이 close() 메소드를 호출하지 않은 상태)를 유지하지 않는 것이 중요합니다. 공유 불가능한 연결이 열려 있으면, 애플리케이션이 현재 해당 연결을 사용하고 있지 않은 경우라도 다른 컴퓨터에서 실제 연결을 사용할 수 없습니다. 공유 가능한 연결과는 달리, 공유 불가능한 연결은 트랜잭션 또는 서블릿 호출이 종료될 때 닫히지 않습니다.
    • 교착 상태 고려사항. 트랜잭션 내에서 컴포넌트가 데이터베이스와 상호작용하는 방식에 따라, 비공유 연결의 사용으로 인해 데이터베이스의 교착 상태가 발생할 수 있습니다. 예를 들어, 트랜잭션 내에서 컴포넌트 A는 데이터 소스 X와 연결되고 테이블 1을 업데이트한 후 컴포넌트 B를 호출합니다. 컴포넌트 B는 데이터 소스 X와 연결한 후 테이블 1(또는 최악의 경우 컴포넌트 A와 동일한 행)을 업데이트하고 읽습니다. 일부 상황(특정 데이터베이스, 잠금 설계 및 트랜잭션 분리 레벨에 따라 달라짐)에서 교착 상태가 발생할 수 있습니다.

      동일한 시나리오에서 공유된 연결로 교착 상태가 발생하지 않는 것은 모든 작업이 동일한 연결에서 수행되기 때문입니다. 공유 연결을 사용하는 코드를 작성할 때, 동일한 트랜잭션 내의 동일한 연결에서 수행할 다중 작업 항목을 요청하는 전략을 사용해야 합니다. 공유 불가능한 연결을 사용할 경우, 연결 팩토리 또는 데이터 소스에서 최대 연결 수 특성을 올바르게 설정해야 합니다. 최대 연결 값을 초과하고 연결 대기 제한시간이 초과되기 전에 공유 불가능한 연결이 닫히지 않으면 연결 요청 대기 중에 예외가 발생할 수 있습니다.

공유 가능한 연결

공유 가능의 res-sharing-scope를 사용하여 검색한 연결 핸들의 일부 특성이 다음 절에 설명되어 있습니다.
  • 비공유 연결의 이점
    • 연결 공유 인스턴스 내에서 애플리케이션 컴포넌트는 핸들 검색 방법 및 사용되는 연결 특성에 따라 하나 이상의 연결 핸들이 있는 관리 연결을 공유할 수 있습니다.
    • 자원을 보다 효율적으로 사용할 수 있습니다. 공유 가능한 연결은 공유 경계 외부에서 유효하지 않습니다. 이러한 이유로 공유 경계의 끝( 트랜잭션)에서 연결 핸들은 더 이상 공유 경계(이것은 캐시된 핸들 패턴을 사용할 경우에만 해당됩니다.) 내에 사용하는 관리 연결과 연관되지 않습니다. 관리 연결은 사용 가능한 연결 풀로 리턴되어 재사용됩니다. 연결 자원은 현재 공유 범위의 끝 이상으로 유지되지 않습니다.

      캐시된 핸들 패턴을 사용하는 경우, 다음에 핸들이 새 공유 범위 내에서 사용될 때 애플리케이션 서버 런타임은 핸들이 현재 공유 범위에 적절한 관리 연결 및 핸들이 처음에 검색될 때 사용된 것과 같은 특성과 다시 연관됩니다. 공유 가능한 연결의 특성을 변경하는 것은 바람직하지 않습니다. 특성이 변경되면, 동일한 연결을 공유하는 기타 컴포넌트에 예기치 않은 작동이 나타날 수 있습니다. 더욱이, 캐시된 핸들을 사용할 경우 변경된 특성 값은 공유 범위에서 기억되지 못할 수 있습니다.

  • 공유 연결의 가능한 결점
    • 단일 컴포넌트(예: 엔터프라이즈 Bean 및 관련 Java 오브젝트) 내에서 공유가 항상 지원되는 것은 아닙니다. 현재의 스펙을 통해 자원 어댑터는 한 번에 하나의 활성 연결 핸들만을 선택할 수 있습니다.
      자원 어댑터가 이 옵션을 구현하기로 선택한 경우, 다음 시나리오 결과 유효하지 않은 핸들 예외가 발생됩니다. 즉, 공유 가능한 연결을 사용하는 컴포넌트는 연결을 가져와 사용합니다. 컴포넌트는 연결을 닫지 않은 상태에서 연결 핸들을 동일한 관리 연결로 가져와 사용하는 유틸리티 클래스(Java 오브젝트)를 호출합니다. 자원 어댑터는 하나의 활성 핸들만을 허용하므로 첫 번째 연결 핸들은 더 이상 유효하지 않습니다. 유틸리티 오브젝트가 핸들을 닫지 않고 리턴되면, 첫 번째 핸들이 유효하지 않고 이 핸들을 사용하려고 할 때 예외가 발생합니다.
      참고: 이러한 예외는 유틸리티 오브젝트(Java 오브젝트)를 호출할 경우에만 발생합니다.

      모든 자원 어댑터에 이 제한사항이 적용되는 것은 아닙니다. 이 예외는 특정 구현에서만 발생합니다. WebSphere 관계형 자원 어댑터(RRA)에는 이러한 제한이 없습니다. RRA를 통해 사용되는 모든 데이터 소스에는 이러한 제한이 없습니다. 이러한 제한이 있는 자원 어댑터가 발생할 경우, 관리 연결로의 액세스를 직렬화하여 작업을 수행할 수 있습니다. 다른 연결 핸들을 가져오기 전에 항상 연결 핸들을 닫고(또는 다른 핸들을 가져오는 코드를 호출하기 전에 핸들을 닫음), 메소드에서 리턴하기 전에 핸들을 닫는 경우, 두 코드 부분으로 동일한 관리 연결을 공유할 수 있습니다. 동시에 두 이벤트에 대해 연결을 사용할 수 없습니다.

    • 글로벌 트랜잭션에서 공유 가능한 JDBC 기반 연결의 분리 레벨을 변경할 경우 예외가 발생합니다. 다른 트랜잭션 분리 레벨과 연결되는 올바른 방법은 IBM® 확장 자원 참조를 구성하는 것입니다.
    • 애플리케이션에서 공유 가능한 연결의 연결 핸들을 닫는 것은 지원되지 않으며 오류가 발생합니다. 그러나 관계형 자원 어댑터를 사용하여 이 제한을 피할 수 있습니다.

느린 연결 연관 최적화

Java EE(Java Platform, Enterprise Edition) Connector(J2C) 연결 관리자는 스마트 핸들 지원을 구현했습니다. 이 기술을 통해, 다른 애플리케이션이 연결 핸들과 연관된 관리 연결을 사용하는 동안 애플리케이션에 연결 핸들을 할당할 수 있습니다(원래 애플리케이션이 연결을 사용하고 있지 않은 경우). 이 개념은 JCA(Java EE Connector Architecture) 1.5 스펙의 일부입니다. (JCA 1.5 스펙 문서의 "느린 연결 연관 최적화" 섹션에서 이를 찾을 수 있습니다.) 스마트 핸들 지원은 ConnectionManager 오브젝트에서의 메소드 사용, LazyAssociatableConnectionManager() 메소드 및 새 마커 인터페이스, DissociatableManagedConnection 클래스를 소개합니다. 자원 어댑터 제공자가 사용자 환경에서 이 기능을 사용 가능하게 하도록 구성해야 합니다. (RRA의 경우, WebSphere Application Server 자체가 제공자입니다.) 다음 코드 조각은 스마트 핸들 지원을 포함시키는 방법을 보여줍니다.
package javax.resource.spi;
import javax.resource.ResourceException;

interface LazyAssociatableConnectionManager { // application server
    void associateConnection(
        Object connection, ManagedConnectionFactory mcf,
        ConnectionRequestInfo info) throws ResourceException;
}

interface DissociatableManagedConnection { // resource adapter
    void dissociateConnections() throws ResourceException;
}

이 DissociatableManagedConnection 인터페이스는 연결 오브젝트에 다른 상태인 비활성을 소개합니다. 이제, 연결 오브젝트는 활성, 닫힘 및 비활성 상태가 될 수 있습니다. 연결 오브젝트는 해당 ManagedConnection 오브젝트가 정리될 때 비활성 상태가 됩니다. 연결은 애플리케이션 컴포넌트가 연결 재사용을 시도할 때까지 비활성 상태를 유지합니다. 그런 다음, 자원 어댑터가 연결 관리자를 다시 호출하여 연결을 활성 ManagedConnection 오브젝트를 다시 연관시킵니다.


주제 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cdat_cconpconh
파일 이름:cdat_cconpconh.html