hikari 데이터베이스 연결 탱크 를 사용 하 는 연결 누 출 검사 과정,데이터베이스 my sql 을 기록 합 니 다.

최근 작업 중 에 오래된 프로젝트(ssh,Maven 이 아 닌...)를 인수 하여 새로운 기능 을 개발 하고 데이터베이스 연결 탱크 를 c3p 0 에서 hikari 로 전환 시 켰 습 니 다.
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
	at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:602)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:427)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
	at com.sun.proxy.$Proxy35.getFailLog(Unknown Source)
	at com.dragonsoft.fwyy.schedule.common.work.PreStatRetryerWork.run(PreStatRetryerWork.java:42)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
	at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
	at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
	at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
	at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:560)
	... 11 more
Caused by: java.sql.SQLTransientConnectionException: HikariPool-2 - Connection is not available, request timed out after 30000ms.
	at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:676)
	at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:190)
	at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:155)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
	at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:85)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
	... 16 more

데이터베이스 연결 이 시간 을 초과 하여 연결 탱크 의 연결 이 소 진 된 것 이 분명 합 니 다.일반적인 상황 이 이런 상황 을 초래 한 이 유 는 프로그램 에 연결 이 풀 리 지 않 았 기 때문이다.건물 주 사용
SHOW FULL PROCESSLIST;                        ,mysql         ,         ,                   (       ),              、       。

구체 적 으로 어떤 줄 의 코드 가 연결 이 유출 되 었 는 지 확인 하기 위해 건물 주 는  hikari 로그 단 계 를 debug 로 조정:

주:이 코드 를 프로젝트 로그 설정 파일 에 두 면 됩 니 다.(건물 주 는 logback.xml)
이 설정 콘 솔 에 가입 하면 30 초 마다 연결 점용 상황 을 인쇄 합 니 다.다음 과 같 습 니 다.
com.zaxxer.hikari.pool.HikariPool - HikariPool-2 - Before cleanup stats (total=10, active=0, idle=10, waiting=0)

이렇게 디 버 깅 을 통 해 특정한 줄 의 코드 에 구체 적 으로 연결 이 유출 될 수 있다.
도움 이 됐 으 면 좋 겠 어 요!
 

좋은 웹페이지 즐겨찾기