2010-06-21 5 views
14

은 (기본 수준) 풀링 JDBC 연결은 이런 식으로 작동합니다JDBC 연결 풀링 : 연결 재사용? 내 이해 당으로

  1. 하는 응용 프로그램 초기화하는 동안 연결을 만들고
  2. 이 응용 프로그램에 필요에 따라 이러한 캐시 연결을 제공 캐시에 넣어
  3. 별도의 스레드는 같은 활동을 수행, 연결 풀을 유지 : (폐쇄) 사용 된
    • 폐기 연결
    • 새 연결을 만들 s와는 연결

그러나, 나는 JDBC 연결 풀링 토론에서 용어 "연결 재사용"를들을 때마다, 나는 혼란의 특정 수를 유지하기 위해 캐시에 추가 할 수 있습니다. 연결 재사용은 언제 발생합니까?

연결 풀이 두 개의 다른 데이터베이스 상호 작용 (연결을 닫지 않고)에 대해 동일한 연결을 제공한다는 것을 의미합니까? 또는 DB 호출 후에도 연결이 끊긴 후에도 연결을 계속 사용할 수 있습니까?

+0

단지 호기심이 있지만 어떤 연결 풀링 라이브러리가 풀 관리를 위해 별도의 스레드를 실행합니까? 나는 Commons-dbcp가 이것을하지 않는다고 생각한다. 적어도 BasicDataSource는 아니다. 커넥션 체크는 커넥션이 풀에서 체크 아웃 될 때 수행됩니다. –

답변

12

연결 풀링은 연결을 다시 사용하여 작동합니다. 응용 프로그램은 풀에서 연결을 "빌려"끝내면 "반환"합니다. 그런 다음 연결이 응용 프로그램의 다른 부분이나 다른 응용 프로그램으로 다시 전달됩니다.

두 스레드가 동시에 동일한 연결을 사용하지 않는 한 완전히 안전합니다.

연결 풀링의 핵심은 대개 값 비싼 작업이므로 가능하면 새 연결을 만들지 않는 것입니다. 연결을 재사용하는 것은 성능 향상에 중요합니다.

10

연결 풀은 드라이버의 실제 Connection 인스턴스를 제공하지 않지만 래퍼를 반환합니다. 풀의 Connection 인스턴스에서 'close()'를 호출하면 드라이버의 Connection을 닫지 않고 풀에 대한 열린 연결 만 반환하므로 재사용 할 수 있습니다 (skaffman의 대답 참조).

+2

이것은 사용중인 연결 풀의 특정 유형에 따라 다릅니다. 'DataSource' 또는 Commons DBCP 스타일. 경량 풀은 원시'Connection'을 반환 할 수 있으며'close()'를 호출하지 않는 응용 프로그램 코드에 의존합니다. – skaffman

+0

따라서 풀의 JDBC 연결은 반드시 Connection.commit() 또는 Connection.setAutoCommit (true)에 의존합니다. 아마도 이러한 호출은 Connection 래퍼의 over-raidden close()에서 수행됩니다. – haps10

-1

내 이해는 위에서 설명한 것과 같으며 버그 덕분에 그것이 맞았다는 증거가 있습니다. 응용 프로그램에서 잘못된 컬럼 이름을 가진 SQL 명령어 인 버그가있었습니다. 실행시 예외가 발생합니다. 연결이 닫히고 다음에 연결할 때 올바른 SQL을 사용하면 이번에는 예외가 다시 발생하고 오류 메시지는 처음에는 오류 메시지와 동일하지만 잘못된 열 이름이 두 번째 SQL. 따라서 연결은 분명히 재사용되고 있습니다. 첫 번째 예외가 발생한 후 연결이 닫히지 않으면 (잘못된 열 이름 때문에) 다음에 연결을 사용할 때 모든 것이 올바르게 작동합니다. 아마도 첫 번째 연결이 다시 사용할 수 있도록 풀로 반환되지 않았기 때문일 수 있습니다. (이 버그는 Jave 1.6_30과 MySQL 데이터베이스 연결에서 발생합니다.)

+3

텍스트의 벽을 피하십시오. 포맷팅을 적극 권장합니다. – Azulflame

+0

형식 지정 외에도 응답을 풍부하게하기 위해 얻은 오류가있는 한 발행 한 SQL 명령을 추가하는 것을 고려하십시오 –

1

연결 풀링은 연결을 다시 사용합니다. 다음은 apache dbcp가 밑줄을 그어 작동하는 방법입니다.

Connection poolableConnection= apacheDbcpDataSource.getConnection(); 

아파치 DBCP 구현 유형 PoolableConnection이다 연결 래퍼를 반환합니다.실제 기본 연결이 닫혀 있지 않으면하지 그럼 연결 풀 (이 경우 GenericObjectPool)로이 PoolableConnection 인스턴스를 반환하는 경우

poolableConnection.close(); 

PoolableConnection.close는() 검사한다.

if (!isUnderlyingConectionClosed) { 
      // Normal close: underlying connection is still open, so we 
      // simply need to return this proxy to the pool 
      try { 
       genericObjectPool.returnObject(this); //this is PoolableConnection instance in this case 
.... 
       }