HikariPool-1 - 연결을 사용할 수 없습니다. 매우 작은 로드 서버의 경우 요청이 30000ms 이후에 시간 초과되었습니다.
테스트용 소형 자바 애플리케이션을 가지고 있습니다.저는 최근에 히카리로 이사했습니다.제가 알아차린 것은 이 오류가 계속 발생한다는 것입니다.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:602)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:195)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85)
아래는 처음 히카리에 대한 저의 설정입니다.
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/****");
config.setUsername("***");
config.setPassword("*****");
config.setMaximumPoolSize(20);
두 개의 장치를 거의 사용하지 않고 끝까지 닫을 것을 보장합니다.그럼 왜 자꾸 에러가 나는지 모르겠네요?무엇이 문제이거나 변경해야 하는 설정이 있습니까?
제 히카리 버전은 히카리 CP-2.6.1.jar입니다.
데이터베이스가 기본 연결인 30000밀리초 이내에 연결되지 않습니다.네트워크 지연 시간 또는 실행 시간이 너무 오래 걸리는 일부 쿼리(30000밀리초 이상)로 인해 시간 초과 속성)가 발생합니다.
.connectionTimeout
.
YML 구성 예:
spring:
datasource:
hikari:
minimumIdle: 2
maximumPoolSize: 10
idleTimeout: 120000
connectionTimeout: 300000
leakDetectionThreshold: 300000
Java 구성 예:
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setConnectionTimeout(300000);
config.setConnectionTimeout(120000);
config.setLeakDetectionThreshold(300000);
같은, 의 해결책은 이렇게 DataSourceUtils.getConnection(dataSource)
그래서 나는 변합니다.dataSource.getConnection()
DataSourceUtils.getConnection(dataSource)
.
제 경우에는 코드가 연결을 닫지 않았습니다.
리소스 사용 시도로 해결:
try (
Connection connection = dataSource.getConnection();
Statement statement = …
) {
…
}
저의 경우 JPA를 사용하고 있었기 때문에 봄부트 프로젝트에 대한 지속성 및 쿼리를 위해 EntityManagerFactory를 사용했지만 동일한 오류가 발생했습니다.
그 이유는 CRUD 작업에서 작업이 완료되면 EntityManager를 닫지 않아 리소스가 소진되었기 때문입니다.
이것이 도움이 되길 바랍니다!!
EntityManager em = emf.createEntityManager();
Customer c = em.find(Customer.class , id);
em.close();
요청 시간 제한은 시간 제한을 늘려서 수정할 수 있는 것이 아닙니다.서비스의 모든 쿼리를 평가하고 필요한 경우 인덱싱을 구현해야 합니다.
클라이언트 앱이 많은 개방형 연결을 요청하고 데이터베이스 서버 설정에 풀 연결 수에 대한 최대 제한이 있는 경우에도 이 문제가 발생할 수 있습니다.따라서 클라이언트 앱이 데이터베이스 서버에서 더 이상 연결을 가져올 수 없습니다.데이터베이스 서버 연결 풀을 확인하여 오류가 발생한 기간 동안 최대값이 초과되었는지 확인합니다.
다음을 사용하여 문제를 해결했습니다.
minIdle 및 maxPool 증가
spring.datasource.hikari.minimumIdle=20
spring.datasource.hikari.maximumPoolSize=30
spring.datasource.hikari.connectionTimeout=50000
문제를 디버그하고 값이 정상인지 확인하려면 Hikari에 대한 로깅을 활성화합니다.
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.com.zaxxer.hikari=TRACE
로그는 다음과 같습니다.
DEBUG 2023-01-06T16:12:31.932018849Z HikariPool-1 - Before cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932665522Z HikariPool-1 - After cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932733949Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:32.495269726Z HikariPool-1 - After adding stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:38.309953158Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:39.200246897Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:44.812065268Z HikariPool-1 - Before cleanup stats (total=18, active=0, idle=18, waiting=0)
DEBUG 2023-01-06T16:12:44.812822113Z HikariPool-1 - After cleanup stats (total=18, active=0, idle=18, waiting=0)
행운을 빌어요! :)
경고: 큰 maximumPoolSize는 코드 냄새일 수 있으며 긴 트랜잭션과 같은 성능 문제를 숨길 수 있으므로 주의하십시오.또한 DB 공급업체는 maximumPoolSize=10과 같이 더 작은 maximumPoolSize를 사용할 것을 권장합니다.DB 성능은 maximumPoolSize에 대한 큰 값의 영향을 받습니다.
그걸 알아내는 데는 오랜 시간이 걸렸습니다...저의 경우 @Andres Rincon과 유사한 솔루션을 사용했습니다.
try (Connection connection = DataSourceUtils.getConnection(jdbcTemplate.getDataSource())) {
// some code here
}
일반적으로 열린 연결과 닫힌 연결이 이 문제의 원인입니다.데이터베이스를 연결하는 응용프로그램 서버에는 제한이 있으며 이 제한을 초과하면 환경이 손상됩니다.
연결은 싱글톤 패턴이어야 하지만 데이터 소스를 열거나 보고서와 같은 외부 데이터 소스를 연결해야 하는 경우 연결 블록을 여는 최종 블록에서 연결을 닫아야 합니다.
connection.getConnection().rollback();
connection.getConnection().close();
싱글턴 없이 지속성Jpa를 사용하는 경우에도 닫아야 합니다.
persistenceJPAConfig.dataSource().getConnection().rollback();
persistenceJPAConfig.dataSource().getConnection().close();
스레드를 생성하여 메서드를 테스트하는 일부 스트레스 테스트 도구를 사용하는 경우 쿼리에서 이 오류가 발생하여 시간이 오래 걸릴 수 있습니다.쿼리 또는 서비스 인스턴스 크기를 최적화하는 데 앞장설 것입니다.
내 경우 a:
o.h.engine.jdbc.spi.SqlExceptionHelper: HikariPool-1 - Connection is not available, request timed out after 30019ms.
i.s.commons.web.error.ExceptionLogger: Internal Server Error
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
너무낮발습니다에 의해 했습니다.spring.hikari.maximumPoolSize
프로그램에서 응용프속서에, 증가에서 5
20
문제를 해결했습니다.로그 메시지가 잘못된 것 같습니다.
제 경우 문제를 해결한 것은 적절한 db 테이블에 적절한 인덱싱을 추가하는 것이었습니다.DB에 대해 수행 중인 쿼리/트랜잭션을 살펴봅니다.
저의 경우 지연 시간을 유발하는 문은 UPDATE 문입니다.
UPDATE table_name WHERE column1 = value1, column2 = value2;
이 경우 문제를 해결한 것은 다음과 같은 두 개의 열에 대한 인덱스를 표에 추가하는 것이었습니다.
CREATE INDEX index_name ON table_name (column1, column2);
또 다른 좋은 이유는 연결을 닫지 않기 때문일 수 있습니다.다음과 같은 리소스 사용 시도 문을 사용하여 연결을 닫을 수 있습니다.
try( Connection connection = datasource.getConnection() ){
//your code
}
Gordhar Singh Rathore가 제안한 것처럼 제한 시간을 늘리는 것은 이상적이지 않다고 생각합니다.일시적으로 문제를 해결할 수는 있지만 적절한 인덱싱 및 닫기 연결 관리를 수행해야 합니다.
이게 도움이 되길 바랍니다.
저의 경우 @Andres Rincon과 유사한 솔루션을 사용했습니다.
try (Connection conn = connectionManager.getDataConnection()) {
Statement stmt = conn.createStatement();
...
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
언급URL : https://stackoverflow.com/questions/47758091/hikaripool-1-connection-is-not-available-request-timed-out-after-30000ms-for
'programing' 카테고리의 다른 글
장고 형태의 CSS 스타일링 (0) | 2023.09.04 |
---|---|
어떻게 쿼리가 각 행 MySQL에 대해 2개의 셀을 곱할 수 있습니까? (0) | 2023.09.04 |
최고의 다중 파일 JavaScript/Flash 파일 업로더는 무엇입니까? (0) | 2023.09.04 |
스위프트 알라모파이어:HTTP 응답 상태 코드를 가져오는 방법 (0) | 2023.09.04 |
Efcore: MaxAsync를 수행할 때 시퀀스에 요소가 없습니다. (0) | 2023.09.04 |