programing

HikariPool-1 - 연결을 사용할 수 없습니다. 매우 작은 로드 서버의 경우 요청이 30000ms 이후에 시간 초과되었습니다.

bestprogram 2023. 9. 4. 20:30

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 프로그램에서 응용프속서에, 증가에서 520문제를 해결했습니다.로그 메시지가 잘못된 것 같습니다.

제 경우 문제를 해결한 것은 적절한 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