연결 라이프사이클
ManagedConnection 오브젝트는 항상 세 개의 상태(DoesNotExist, InFreePool 또는 InUse) 중 하나입니다.
연결이 작성되기 전에는 DoesNotExist 상태여야 합니다. 연결이 작성된 후에는 애플리케이션에 할당되었는지 여부에 따라 연결은 InUse 또는 InFreePool 상태일 수 있습니다.
- 애플리케이션이 데이터 소스 또는 연결 팩토리 getConnection() 메소드(getConnection 조건)를 호출했습니다.
- 일치하는 특성(freeConnectionAvailable 조건)이 있는 풀에서 연결을 사용할 수 있습니다.
- 및 다음 두 가지 조건 중 하나를 충족하는 경우:
- getConnection() 요청이 공유 불가능으로 표시된 자원 참조를 대신합니다.
- getConnection() 요청은 공유 가능으로 표시되었으나 사용 중인 동일한 특성을 가진 사용 중인 공유 가능한 연결이 없는 자원 참조를 대신합니다.
InFreePool > InUse: getConnection AND freeConnectionAvailable AND NOT(shareableConnectionAvailable)다음은 보호 조건 및 설명 목록입니다.
조건 | 설명 |
---|---|
ageTimeoutExpired | 연결이 ageTimeout 값보다 이전입니다. |
close | Connection 오브젝트에서 애플리케이션이 close 메소드를 호출합니다. |
fatalErrorNotification | 연결에 심각한 오류가 있습니다. |
freeConnectionAvailable | 일치하는 특성을 가진 연결을 사용 가능한 풀에서 사용할 수 있습니다. |
getConnection | 데이터 소스 또는 연결 팩토리 오브젝트에서의 애플리케이션 호출 getConnection 메소드 |
markedStale | 일반적으로 심각한 오류 알림에 대한 응답으로 연결이 손상된 것으로 표시합니다. |
noOtherReferences | 연결 관리에 대해서는 하나의 연결 핸들만이 존재하며, 트랜잭션 서비스는 연결 관리에 대한 어떠한 참조도 보유하지 않습니다. |
noTx | 트랜잭션이 강제로 실행되지 않습니다. |
poolSizeGTMin | 연결 풀 크기는 최소 풀 크기(최소 연결 수)보다 큽니다. |
poolSizeLTMax | 풀 크기는 최대 풀 크기(최대 연결 수)보다 작습니다. |
shareableConnectionAvailable | getConnection() 요청은 공유 가능한 연결을 위한 것이고, 일치하는 특성을 가진 연결은 사용 중이며 공유할 수 있습니다. |
TxEnds | 트랜잭션이 종료되었습니다. |
unshareableConnectionRequest | getConnection() 요청은 공유 불가능한 연결을 위한 것입니다. |
unusedTimeoutExpired | 연결이 사용 가능한 풀에 있으며 사용하지 않음 제한시간 값을 경과해서 사용 중이 아닙니다. |
연결 가져오기
여기에서 다루는 첫 번째 전환 세트는 애플리케이션이 데이터 소스 또는 연결 팩토리에서 연결을 요청한 세트입니다. 이 시나리오 중 일부에서 데이터베이스에 대한 새 연결이 작성됩니다. 다른 시나리오에서 이 연결은 연결 풀에서 검색되거나 임의 연결의 다른 요청과 공유될 수 있습니다.getConnection AND NOT(freeConnectionAvailable) AND poolSizeLTMax AND (NOT(shareableConnectionAvailable) OR unshareableConnectionRequest)
- 애플리케이션은 데이터 소스 또는 연결 팩토리에서 getConnection() 메소드를 호출합니다.
- 사용 가능한 풀(NOT(freeConnectionAvailable))에서 연결을 사용할 수 없습니다.
- 풀 크기는 최대 풀 크기(poolSizeLTMax)보다 작습니다.
- 요청이 공유 가능한 연결을 위한 것이고 동일한 공유 특성(NOT(shareableConnectionAvailable))과 함께 이미 사용 중인 공유 가능한 연결이 없는 경우, 요청은 공유 불가능한 연결(unshareableConnectionRequest)을 위한 것입니다.
모든 연결은 DoesNotExist 상태에서 시작되며 애플리케이션이 연결을 요청할 경우에만 작성됩니다. 애플리케이션이 새로운 연결을 요청하면, 해당 풀은 0에서 최대 연결 수까지 증가합니다. 풀은 서버가 시작될 때 최소 연결 수로 작성되지 않습니다.
요청이 공유 가능한 연결을 위한 것이고 동일한 공유 특성을 가진 연결이 이미 애플리케이션에 의해 사용 중이면 연결은 두 개 이상의 연결 요청으로 공유됩니다. 이 경우, 새로운 연결은 작성되지 않습니다. JDBC API 사용자를 위한 이 공유 특성은 대부분 userid/password 및 transaction context이며 자원 어댑터 CCI(Common Client Interface) 인터페이스 사용자를 위한 것으로는 ConnectionSpec, Subject, transaction context가 있습니다.
InFreePool>InUse: getConnection AND freeConnectionAvailable AND (unshareableConnectionRequest OR NOT(shareableConnectionAvailable))
- 애플리케이션이 getConnection() 호출을 발행했습니다.
- 연결 풀(freeConnectionAvailable)에서 연결을 사용할 수 있습니다.
- 다음 중 하나가 적용되는 경우:
- 요청은 공유 불가능한 연결(unsharableConnectionRequest)을 위한 것입니다.
- 트랜잭션에서 동일한 공유 특성을 갖는 연결이 사용되고 있지 않습니다. (NOT(sharableConnectionAvailable)).
사용 가능한 풀에서 연결을 수행할 수 있는 연결 요청은 데이터베이스로의 연결을 새로 작성하지 않습니다. 따라서 임의 수의 애플리케이션으로 풀에서 한 번에 둘 이상의 연결을 사용하지 못하는 경우, 풀의 크기는 1보다 크게 증가하지 않습니다. 이 숫자는 풀에서 지정된 최소 연결 수보다 작을 수 있습니다. 풀이 최소 연결 수로 증가되는 방법 중 하나는 애플리케이션에 연결이 새로 작성되도록 하는 여러 개의 연결 동시 요청이 있는 경우입니다.
InUse>InUse: getConnection AND ShareableConnectionAvailable
이 상태 전이는 애플리케이션이 이미 사용 중인 연결과 동일한 공유 특성(ShareableConnectionAvailable)의 공유 가능 연결을 요청하는 경우(getConnection) 기존 연결이 공유되는 것을 표시합니다.
연결 리턴
앞에서 언급된 모든 상태 전이는 애플리케이션 사용을 위한 연결 가져오기에 대한 것이었습니다. 이 목표에서는 상태 전이로 인해 연결이 닫히고 사용 가능한 풀로 리턴되거나 삭제됩니다. 애플리케이션은 연결 오브젝트에서 close()를 호출하여 명확하게 연결(참고: 사용자가 다시 가져오는 연결은 진정한 의미에서 연결 핸들)을 닫아야 합니다. 대부분의 경우 이 조치로 인해 다음과 같은 상태 전이가 발생합니다.InUse>InFreePool: (close AND noOtherReferences AND NoTx AND UnshareableConnection) OR (ShareableConnection AND TxEnds)
- 애플리케이션 또는 컨테이너가 close()(닫기 조건 생성)를 호출하고 애플리케이션(애플리케이션 공유 조건에서) 또는 트랜잭션 관리자(NoTx 조건에서, 트랜잭션에 연결이 등록될 때 트랜잭션 관리자가 참조를 보유함을 의미)에 의한 참조(noOtherReferences 조건)가 없는 경우, 연결 오브젝트가 사용 가능한 풀로 리턴됩니다.
- 트랜잭션에 연결이 등록되지만 트랜잭션 관리자가 트랜잭션(txEnds 조건)을 종료하고 연결이 공유 가능한 연결(ShareableConnection 조건)인 경우, 연결은 닫히고 풀로 리턴됩니다.
애플리케이션이 연결에서 close()를 호출할 경우, 애플리케이션은 해당 연결을 사용 가능한 연결의 풀로 리턴합니다. 그러나 데이터 저장소에 대한 연결은 닫히지 않습니다. 애플리케이션이 현재 공유 중인 연결에서 close()를 호출할 경우, 해당 연결은 사용 가능한 풀로 리턴되지 않습니다. 애플리케이션이 연결에 대한 마지막 참조를 삭제한 후에만 트랜잭션이 종료되며 해당 연결은 풀로 리턴됩니다. 공유 불가능한 연결을 사용하는 애플리케이션은 시기 적절한 방법을 통해 매우 주의하여 연결을 닫아야 합니다. 이렇게 하지 않으면 해당 연결 풀이 없어져 서버에서 실행 중인 애플리케이션이 연결을 가져올 수 없습니다.
애플리케이션이 트랜잭션에 등록된 연결에서 close()를 호출할 경우 해당 연결은 사용 가능한 풀로 리턴되지 않습니다. 트랜잭션 관리자는 연결 오브젝트에 대한 참조를 보유해야 하기 때문에 연결은 트랜잭션이 종료될 때까지 사용 가능한 풀로 리턴될 수 없습니다. 연결이 일단 트랜잭션에 등록되면, 트랜잭션이 완료된 후까지 다른 애플리케이션의 다른 트랜잭션에서 사용할 수 없습니다.
InUse>DoesNotExist: close AND markedStale AND NoTx AND noOtherReferences
이 상태 전이는 애플리케이션이 연결에서 close()를 호출하고 해당 연결이 풀 정리 단계(markedStale) 동안에 손상으로 표시될 경우, 연결 오브젝트는 데이터 저장소에 대해 닫히며 풀로 리턴되지 않습니다.
마지막으로 데이터 저장소로의 연결을 닫고 풀에서 제거할 수 있습니다.
- 자원 어댑터(또는 데이터 소스)에서 심각한 오류 알림을 수신할 경우. 연결을 사용할 수 없을 때 자원 어댑터에서 심각한 오류 알림(FatalErrorNotification)이 수신됩니다. 현재 사용 가능한 풀에 있는 모든 연결이 삭제됩니다.
- 해당 연결이 사용하지 않음 제한시간(UnusedTimeoutExpired) 기간보다 오랫동안 사용 가능한 풀에 있고 풀 크기가 최소 연결 수(poolSizeGTMin)보다 클 경우, 연결은 사용 가능한 풀에서 제거되어 삭제됩니다. 이 메커니즘을 통해 풀을 연결 요구가 감소할 때 최소 크기로 줄일 수 있습니다.
- 유효 기간의 제한시간이 구성되고 지정된 연결이 제한시간보다 오래된 경우. 이 메커니즘은 유효 기간을 기반으로 연결을 재순환하는 방법을 제공합니다.