사용자 도구

사이트 도구


java:database:hikaricp

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:database:hikaricp [2019/03/21 12:18]
kwon37xi
java:database:hikaricp [2021/08/06 13:51] (현재)
kwon37xi [leak-detection-threashold]
줄 1: 줄 1:
 ====== HikariCP ====== ====== HikariCP ======
-  * [[http://brettwooldridge.github.io/HikariCP/|HikariCP]]+  * [[https://github.com/brettwooldridge/HikariCP|HikariCP]]
   * [[java:database:bonecp|BoneCP]] 보다 더 빠른 Connection Pool.   * [[java:database:bonecp|BoneCP]] 보다 더 빠른 Connection Pool.
   * 현재 훨씬 더 활발하게 개발이 진행되고 있다. Hibernate도 기본 커넥션 풀로 지원하고 있다.   * 현재 훨씬 더 활발하게 개발이 진행되고 있다. Hibernate도 기본 커넥션 풀로 지원하고 있다.
줄 10: 줄 10:
     * **Do not rely on hypervisor settings to "synchronize" the clock of the virtual machine. Configure time-source synchronization inside the virtual machine.**     * **Do not rely on hypervisor settings to "synchronize" the clock of the virtual machine. Configure time-source synchronization inside the virtual machine.**
     * 이는 시간에 민감하게 작동하는 모든 Java 애플리케이션/라이브러리와 상관이 있다.     * 이는 시간에 민감하게 작동하는 모든 Java 애플리케이션/라이브러리와 상관이 있다.
 +  * maxlifetime 은 항상 DB가 접속을 끊는 시간([[database:mysql|MySQL]]의 경우 ''wait_timeout'') 값 보다 짧아야만 한다
 +    * [[java:database:tomcat_pool|Tomcat JDBC Pool]]이나 [[java:database:dbcp|DBCP - Java Connection Pool]]와는 달리 중간중간 idle 커넥션에 대한 연결 유지 기능이 없기 때문
 +
 +
 ===== Performance Tuning ===== ===== Performance Tuning =====
   * [[https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration|MySQL Configuration · brettwooldridge/HikariCP Wiki]]   * [[https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration|MySQL Configuration · brettwooldridge/HikariCP Wiki]]
  
-===== 고 =====+===== leak-detection-threashold ===== 
 +  * ''leakDetectionThreshold'' 
 +    * ''0''이면 검출하지 않음. 
 +  * 특정 시간 이내에 커넥션이 반환이 안 되면 connection leak 으로 판단하고 leak 을 일으킨 stack trace 를 로그로 남기는 기능이 있음. 
 +  * 단, **이것은 진짜 leak이 아니고 지정 시간이 지나도 쿼리가 계속 실행될 경우, leak-detection 으로 판단**하기도 하기 때문에 혼란을 줄 수 있다. 
 +  * 따라서 이 값을 ''max-lifetime''보다 작게 주는 것이 좋다. 
 +  * [[https://stackoverflow.com/questions/54883940/apparent-connection-leak-detected-with-hikari-cp|java - Apparent connection leak detected with Hikari CP - Stack Overflow]] 
 +    * ''Connection leak detection triggered for'', ''Apparent connection leak detected'' 
 + 
 +<code> 
 +WARN 924 --- [l-1 housekeeper] com.zaxxer.hikari.pool.ProxyLeakTask     : Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@ffd3737 on thread http-nio-80-exec-8, stack trace follows 
 + 
 +java.lang.Exception: Apparent connection leak detected 
 +    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.9.jar:na] 
 +.... 
 + 
 +Stacktrace 를 잘 보면 leak 을 일으킨 호출 코드를 볼 수 있다. 
 +</code> 
 + 
 +===== max-lifetime =====
   * [[https://pkgonan.github.io/2018/04/HikariCP-test-while-idle|HikariCP는 test-while-idle과 같은 커넥션 갱신 기능이 없을까?]]   * [[https://pkgonan.github.io/2018/04/HikariCP-test-while-idle|HikariCP는 test-while-idle과 같은 커넥션 갱신 기능이 없을까?]]
     * ''test-while-idle''로 접속을 장시간 유지하지 말고 ''max-lifetime''을 짧게 줘서 커넥션을 새로 맺게 하자.     * ''test-while-idle''로 접속을 장시간 유지하지 말고 ''max-lifetime''을 짧게 줘서 커넥션을 새로 맺게 하자.
 +    * **''max-lifetime''이 DB의 ''wait_timeout''보다 더 적은 값이라는 것(2~3초 정도 짧게)을 확인해야한다.**
     * HikariCP는 max-lifetime에 의한 커넥션 교체를 별도 쓰레드에서 성능저하 없이 부드럽게 수행한다.     * HikariCP는 max-lifetime에 의한 커넥션 교체를 별도 쓰레드에서 성능저하 없이 부드럽게 수행한다.
   * [[https://github.com/brettwooldridge/HikariCP/issues/625?fbclid=IwAR3p4jxzveOqRaFneDa5PtRuj3Hj1iPtjUrrLOFgJ7RwsaeOWaVS7zUObdM|Problems with MySQL master/slave allowMasterDownConnections · Issue #625 · brettwooldridge/HikariCP]]    * [[https://github.com/brettwooldridge/HikariCP/issues/625?fbclid=IwAR3p4jxzveOqRaFneDa5PtRuj3Hj1iPtjUrrLOFgJ7RwsaeOWaVS7zUObdM|Problems with MySQL master/slave allowMasterDownConnections · Issue #625 · brettwooldridge/HikariCP]] 
줄 21: 줄 45:
     * master 다운되고 그 상태 유지시에 slave도 작동을 안함.     * master 다운되고 그 상태 유지시에 slave도 작동을 안함.
     * 이 문제를 조금이나마 피하려면 ''max-lifetime''을 짧게 주면 될 듯.     * 이 문제를 조금이나마 피하려면 ''max-lifetime''을 짧게 주면 될 듯.
 +
 +
 +===== 참고 =====
 +
   * [[https://www.mkyong.com/jdbc/hikaripool-1-connection-is-not-available-request-timed-out-after-30002ms/|HikariPool-1 – Connection is not available, request timed out after 30002ms. – Mkyong.com]]   * [[https://www.mkyong.com/jdbc/hikaripool-1-connection-is-not-available-request-timed-out-after-30002ms/|HikariPool-1 – Connection is not available, request timed out after 30002ms. – Mkyong.com]]
 +  * [[https://github.com/brettwooldridge/HikariCP/issues/657|#657 idleTimeout does not appear to be being honoured]] : Pool의 ''minIdle == maxPoolSize''인 경우에는 ''idleTimeout'' 값은 의미가 없어서 무시된다.
java/database/hikaricp.1553138297.txt.gz · 마지막으로 수정됨: 2019/03/21 12:18 저자 kwon37xi