2012-09-22 2 views
9

DriverManager.getConnection()DataSource.getConnection()을 사용하여 연결 객체를 얻으면 해당 객체에서 .close()을 호출하면 동작이 어떻게 달라 집니까?연결 동작 - DriverManager.getConnection() 및 DataSource.getConnection()

.close() 메서드 호출 전에이 두 가지 서로 다른 연결에서 관련 StatementResultSet 개체가 있습니다. 이 두 객체를 얻은 직후에 connection1.close() (~ DriverManager.getConnection()까지)이 연결 객체를 무효화하고 관련된 Statement 및 ResultSet 객체에 액세스 할 수 없거나 허용되지 않는다고 가정합니다. 틀 렸으면 고쳐줘?

두 번째 시나리오는 이제 connection2.close() (DataSource.getConnection()까지)이라고 말하면 간단히 풀로 되돌립니다. 그러나 연결은 아직 살아 있습니다. 연결된 StatementResultSet 개체에 액세스 할 수 있습니까?

답변

6

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에 요청하여. (사용자에) 동작한다 연결 풀로부터 얻어진

+0

, 난 내'Connection' 개체를 닫아도 내'ResultSet' 개체에 액세스 할 수 있어요. 따라서 Websphere는이 구현을 실패했습니다. – Sriram

+0

액세스가 무슨 뜻인지에 따라 다릅니다. ResultSet 객체는 여전히 존재하지만 논리적 연결이 종료되었을 때이 폐쇄되어 있어야합니다 당신은 결과 집합을 사용할 수 없게한다. –

+1

그리고는 WebSphere의 잘못된 구현하는 경우 : 당신은 웹 스피어의'DataSource'의'ConnectionPoolDataSource'으로 사용에 따라 달라집니다. 설명 된 동작은'PooledConnection' 구현에 의해 시행되어야합니다. –

3

connection1.close() (DriverManager.getConnection를 통해()),

이 데이터베이스에 설정된 물리적 연결과 모든 자원 즉를 닫습니다. 결과 집합, 문, 연결이 해제됩니다. 따라서 연결이 닫힌 후에는 액세스 할 수 없습니다.

connection2.close() (관통적인 DataSource.getConnection())

이 데이터 소스 종속 - 구현에 따라서 동작하고 다른 데이터 소스 구현 일관 될 필요하다. 또한 주어진 DataSource 구현 내에서 연결의 실제 수명주기는 여러 다른 매개 변수에 따라 달라 지므로이 Connection을 DriverManager를 통해 얻은 Connection과 구별하지 않는 것이 좋습니다. 당신이 정말로 StatementConnection이 닫힌 후 ResultSet에서 개최 된 데이터를 사용할 수있게하려면 그 사용자의 쓰임새에 맞는 경우

, 당신은 CachedRowSet 좀 걸릴 수 있습니다.

+2

DriverManager의 논리적 접속에 의한 물리적 연결 정확히 동일. 따라서 물리적 연결이 열린 채로 있더라도 연결 및 모든 종속 개체가 닫힌 것처럼 보일 것입니다. 데이터 소스 구현이 그렇지 않으면 JDBC 스펙을 준수하지 못합니다. 내 응용 프로그램에서 –

3

클라이언트 측 캐싱은 확실하지 않은 연결에 사용되는 드라이버에 따라 달라질 수 있습니다. 그러나 일부 드라이버는 특히 연결이 닫히면 명령문이나 결과 집합을 사용하지 못하게합니다. 다른 클라이언트 측에서 결과 집합을 유지합니다.