사용자 도구

사이트 도구


java:database:dbcp

DBCP - Java Connection Pool

Eviction 정책

  • numTestsPerEvictionRun : -1을 주면 매번 전체 idle 커넥션에 대한 eviction 테스트를 진행하며 이 경우에는 성능저하가 있을 수 있음. tomcat jdbc connection pool 에서는 이 값을 무시하고 항상 전체 커넥션을 validation 한다.
  • timeBetweenEvictionRunsMillis : numTestsPerEvictionRun이 작은 상태에서 이 값도 작으면 오랜시간 idle 상태로 유지되면서 비정상 커넥션으로 떨어질 가능성이 높아짐.
  • 결국, numTestsPerEvictionRun는 작게(3 정도?), timeBetweenEvictionRunsMillis 도 작게(5000ms 정도?)로 주는 것이 좋다.

maxConnLifetimeMillis 오류로그

  • java.lang.Exception: The lifetime of the connection [300,008] milliseconds exceeds the maximum permitted value of [300,000] milliseconds 와 같은 WARN 메시지 발생

validationQuery

  • testOnBorrow 혹은 testWhileIdle 등에 사용되는 쿼리 유효성 검사 쿼리.
  • DBCP2와 JDBC 4를 지원하는 Driver를 조합해서 사용할 경우 이 값을 비워두면 Connection.isValid(int)를 호출한다.
  • JDBC 4 드라이버는 이 메소드를 성능 저하없이 커넥션의 유효성을 검사하는 방식으로 구현한다.
  • 따라서 validationQuery 값은 비워두는 것이 좋다.
  • MySQL JDBC의 경우에는 /* ping */으로 시작하는 쿼리를 지정해도 동일한 효과가 난다.
  • validationQueryTimeout 값도 함께 지정해주도록 한다. 초(sec) 단위.

connectionInitSqls

  • 접속 맺은 후 실행할 명령 List

removeAbandoned*

  • 과거에 connection을 직접 맺고 끊던 시절에 close를 올바로 안한 커넥션을 강제 반환 시키는 옵션으로 보임.
  • 현대 애플리케이션은 프레임워크가 커넥션을 관리하기 때문에 close가 안될 가능성이 적음.
  • 설정할 필요가 기본으로는 없어 보임.
  • 만약 설정한다면 최대 시간을 애플리케이션이 실행할 쿼리의 최대 시간보다 약간 큰 값으로 해야한다.

참고

java/database/dbcp.txt · 마지막으로 수정됨: 2018/12/18 16:19 저자 kwon37xi