DataSource
(즉, 연결 풀링을 수행하지 않는 것)이라고 가정하면 DriverManager
(일부는)에서 얻은 것과 동일한 실제 연결을 얻습니다. 드라이버는 내부적으로 DataSource의 DriverManager 또는 DriverManager의 DataSource를 사용합니다. 따라서 이러한 연결은 동일하게 작동합니다.
연결 풀링을 제공하는 DataSource
으로 가정하면 데이터 소스 자체는 ConnectionPoolDataSource
(또는 이와 유사한 내부 메커니즘)을 사용하여 PooledConnection
을 얻습니다. 이 PooledConnection은 데이터베이스에 대한 실제 실제 연결을 관리합니다.
사용자가 DataSource에서 연결을 요청하면 DataSource는 PooledConnection을 체크 아웃하고 Connection
을 요청합니다. 그런 다음 PooledConnection은 물리적 연결을 사용하거나 랩하는 논리적 연결을 만듭니다 (예 : 프록시 사용). DataSource는 해당 논리적 연결을 사용자에게 반환합니다.논리적 연결은 모든 측면에서 물리적 연결 동일 행동해야 사용자에게
. 따라서 사용자가 연결을 닫으면 해당 논리적 연결과 모든 종속 JDBC 객체가 닫히고 실제 연결 닫기와 동일하게 동작합니다.
JDBC 4.1 11.1 말한다 :
연결 풀링은 클라이언트에 완전히 투명 : 클라이언트는 풀 연결을 획득하고 획득 단지 같은 방법을 사용하고 비 풀링 된 연결을 사용합니다.
그리고 섹션 11.4 : 응용 프로그램이 논리적 핸들을 다시 사용하려고하면
는 연결 구현 는 SQLException을 발생합니다.
주어진이 PooledConnection 객체의 경우
, 가장 최근에 생성 된 논리적 연결 개체는 유효합니다. 연결된 PooledConnection.getConnection 메서드가 호출 될 때 기존의 Connection 객체는 자동으로 닫힙니다. 폐쇄 그러나 배경 논리 연결이 종료되면,이 PooledConnection 그것이 재사용 가능한 데이터 소스 신호 것이고, 데이터 소스가 그 연결 풀에 반환되거나 PooledConnection에 종료됩니다에서
(물리적 연결). 더 이상 연결이 필요하지 않은 경우.
데이터 소스는 강제적으로 사용자로부터의 접속을 취소 할 수있다 (예, 연결 등, 너무 오래 체크 아웃 할 때), 논리적 연결을 닫 PooledConnection에 요청하여. (사용자에) 동작한다 연결 풀로부터 얻어진
, 난 내'Connection' 개체를 닫아도 내'ResultSet' 개체에 액세스 할 수 있어요. 따라서 Websphere는이 구현을 실패했습니다. – Sriram
액세스가 무슨 뜻인지에 따라 다릅니다. ResultSet 객체는 여전히 존재하지만 논리적 연결이 종료되었을 때이 폐쇄되어 있어야합니다 당신은 결과 집합을 사용할 수 없게한다. –
그리고는 WebSphere의 잘못된 구현하는 경우 : 당신은 웹 스피어의'DataSource'의'ConnectionPoolDataSource'으로 사용에 따라 달라집니다. 설명 된 동작은'PooledConnection' 구현에 의해 시행되어야합니다. –