2014-12-03 8 views
0

JDBC 연결 풀링에 HikariCP을 사용하는 프로젝트가 있습니다. 그리고 HikariCP는 내 요구에 잘 맞습니다. 또한 아래와 같이 풀의 통계를 기록합니다. 그냥 내가 MySQL Workbench를 사용하여 구성 데이터베이스에 대한 모든 MySQL 연결을 폐쇄 실험 목적JDBC 연결은 어떻게 구현됩니까?

2014-12-03 10:16:08 DEBUG HikariPool:559 - Before cleanup pool stats loginPool (total=8, inUse=0, avail=8, waiting=0) 
    2014-12-03 10:16:08 DEBUG HikariPool:559 - After cleanup pool stats loginPool (total=7, inUse=1, avail=7, waiting=0) 

. 그러나 데이터베이스에 대한 실제 연결은 없지만 이전처럼 통계를 로깅하는 것은 여전히 ​​HikariCP입니다. 연결 요청이있을 때 즉시 연결 (초기 8)을 설정 했으므로 모든 것이 잘 작동합니다.

제 질문은 이러한 연결을 어떻게 관리 또는 구현합니까? 나는 실제적으로 데이터베이스에 존재하지 않는 연결에 대한 메모리 참조가 유효하기 때문에 연결이있는 것처럼 HikariCP이 통계를 기록하는 이유가 무엇이라고 생각합니다.

내 이해가 정확합니까?

답변

1

MySQL Workbench를 사용하여 연결을 닫으면 서버 측에서 연결을 종료합니다. JDBC (클라이언트) 측에서는 이전에 설정 한 연결은 클라이언트 코드가 사용하려고 시도 할 때까지 존재합니다. 그 시점에서 그들은 "부러진"것으로 판명 될 것입니다. 즉 클라이언트는 예외를 사용하려고 할 때 예외를받습니다.

클라이언트 측 JDBC 연결 객체는 Java 응용 프로그램 코드에 의해 연결 풀로 반환 될 때만 닫히거나 재활용됩니다.

+0

궁금 해서요. 나는 그 질문이 광범위하다는 것을 이미 인정했다. 그러나 Java 힙 객체와 외부 연결 간의 연결을 이해하는 데 사용할 수있는 소스가 있습니까? – phoenix

+1

MySQL Connector/J와 HikariCP 모두를위한 소스 코드가 필요합니다. JVM 소스 코드를 드릴 다운하면 관련성이있는 정보를 알려주지 않을 것입니다. (이 수준에서 이것은 소켓과 스트림에 매핑하는 것일 뿐이며 JDBC 클라이언트 API에서 관찰 한 것과 관련된 "관리"가 진행되지는 않습니다.) –

1

연결 풀은 시작할 때 8 개의 연결을 만들었습니다. 워크 벤치를 사용하여 연결을 끊었다 고 가정합니다. 대부분의 연결 풀은 연결이 사용되기 전까지 연결이 끊어짐을 알지 못합니다.

귀하의 가정은 정확합니다. 당신은 수동으로 연결을 죽였지 만 풀은 연결되어 있다고 가정하는 8 개의 소켓에 대한 핸들을 가지고 있습니다. 주어진 연결 풀에서 연결의 유효성을 검사하고 연결 풀을 다시 연결하려고 시도했을 수 있습니다. 나는 HikariCP에 대해 말할 수 없지만 이것이 현대적인 연결 풀이하는 것입니다.

+0

감사합니다. 그러나 저는 주로 내부 업무에 관심이 많았습니다. 어떻게 관리됩니까? – phoenix

+0

음 .. "managed"를 설명 하시겠습니까? 연결 풀의 목적은 실제 JDBC 연결을 풀에서 반환 된 연결에서 추상화하는 것입니다. 준비된 문 작성과 같은 작업을 수행 한 다음 가능하면 동일한 연결에서 후속 문을 실행하려고 시도 할 수 있습니다. 풀이 최적화하기를 원하는 방법에 따라 코드에서 볼 수있는 Connection 객체와 실제 연결 사이에는 1 대 1의 관계가 없을 수 있습니다. "어떻게 관리되고 있니?" 큰 질문입니다. – slipperyseal

+0

예. 나는 내 실수를 깨닫는다. 사실 문제는 매우 광범위합니다. – phoenix