2016-08-30 6 views
1

히카리 재사용 : 2.4.7JDBC 연결 라이프 사이클

PostgreSQL의 JDBC를 드라이버 : 9.4-1201-jdbc41 나에 대한 java.sql.Connection 객체에 수행해야 이해하기 위해 노력하고있어

을 연결 풀 에서 다시 사용할 수 있습니까?

방금 ​​멀티 스레드 응용 프로그램에 연결 풀링을 도입했습니다.이 풀링은 각 SQL 문과의 연결을 앞당겨 서/찢어 버렸습니다. 입니다. 내가 발견 한 무엇

는 히카리를 도입 한 후, 최대한 빨리 HikariDataSource.getConnection에 모든 노력을 이후 maximumPoolSize 충돌로 인해 connectionTimeout에 실패 할 것입니다. 그래서 어떻게 든이 연결을 "해제"하지 않는 것 같습니다.

Connection 객체의 일반적인 용도는 다음과 같습니다 연결 풀에서 재사용이 자격을 얻기 위해이 연결에서 수행 될 것으로 예상된다 다른 아무것도

# omits Exception handling, parameter substitution, result evaluation. 
PreparedStatement preparedStatement = hikariDataSource.getConnection().prepareStatement(sql); 
preparedStatement.executeQuery(); 
preparedStatement.close(); 

있습니까?

Autocommit입니다. Connection.close(), 히카리가 제공 할 때 특별한 것을하지 않는 한, 나는 피하고 싶었던 정확한 것처럼 보였다.

답변

4

나는 히카리를 구체적으로 모르지만 연결 풀에서 나가는 모든 연결에 대해 을 반환해야합니다.이 작업을 완료하면으로 연결해야합니다.

일반적으로 Connection.close()을 사용하여 풀을 처리합니다. 풀은 래퍼 함수를 ​​전달합니다. close()은 물리적으로 연결을 닫지 않고 반환합니다.

그래서 코드는 다음과 같아야합니다 : 물론

Connection con = hikariDataSource.getConnection(); 
PreparedStatement preparedStatement = con.prepareStatement(sql); 
preparedStatement.executeQuery(); 
preparedStatement.close(); 
con.close(); // this returns the connection to the pool 

close() 방법이 finally 블록에서 호출해야합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. [소스] (https://github.com/brettwooldridge/HikariCP/blob/dev/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java#L228)를 확인하고 주장이 스포트 인 것처럼 보입니다. on - 나는 Connection.close와 PoolEntry.recycle()에서 재활용 동작을 볼 수있다. 그것에게 균열을주고 upvotes와 녹색 진드기로 돌아올 것입니다. – markdsievers

+0

이상 : try-with-resources를 사용하십시오. –