Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- docker
- 프로그래머스 코딩테스트
- 개발자 채용연계형인턴
- 플레이팅
- 직장인점심구독
- 신입 개발자 자바 면접
- 프로그래머스
- 자바 암호화 알고리즘
- 신입 개발자 면접 질문
- docker image
- 신입 개발자 자바 면접 질문
- 식단
- 신입 개발자 면접
- 자바 암호화 복호화
- 개발자 인턴
- 개발자 면접
- 셰프의찾아가는구내식당
- Linux
- 개발자 코딩테스트
- 샐러드
- 개발자 정규직
- 코딩테스트 연습
- 식단일기
- 신입 개발자 필수 면접 질문
- .dockerignore
- 자바 stream
- Plating
- 도커
- 개발자 면접 질문
- 자바 암호화
Archives
- Today
- Total
달리는 두딘
[DB] wait_timeout 관련 본문
wait_timeout(활동하지 않는 커넥션을 끊을때까지 서버가 대기하는 시간) 관련
hikariPool - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@7aa2f8a6 ((conn=463456) Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value.
- DB는 idle 상태의 커넥션을 wait_timeout이 지나면 연결을 종료한다.
- 스프링 서버는 idle 상태의 커넥션을 max-lifetime이 지나면 연결을 끊고 새로운 커넥션을 생성한다.
- max-lifetime이 wait_timeout보다 짧아야 RDS가 커넥션을 끊기 전에 스프링 서버 스스로 연결을 끊고 새로운 커넥션을 맺기 때문에 문제가 발생하지 않는다.
어디서 나는 에러일까?
package com.zaxxer.hikari.pool;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.SQLExceptionOverride;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException;
import com.zaxxer.hikari.util.DriverDataSource;
import com.zaxxer.hikari.util.PropertyElf;
import com.zaxxer.hikari.util.UtilityElf;
import com.zaxxer.hikari.util.UtilityElf.DefaultThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
abstract class PoolBase {
boolean isConnectionDead(final Connection connection)
{
try {
try {
setNetworkTimeout(connection, validationTimeout);
final var validationSeconds = (int) Math.max(1000L, validationTimeout) / 1000;
if (isUseJdbc4Validation) {
return !connection.isValid(validationSeconds);
}
try (var statement = connection.createStatement()) {
if (isNetworkTimeoutSupported != TRUE) {
setQueryTimeout(statement, validationSeconds);
}
statement.execute(config.getConnectionTestQuery());
}
}
finally {
setNetworkTimeout(connection, networkTimeout);
if (isIsolateInternalQueries && !isAutoCommit) {
connection.rollback();
}
}
return false;
}
catch (Exception e) {
lastConnectionFailure.set(e);
logger.warn("{} - Failed to validate connection {} ({}). Possibly consider using a shorter maxLifetime value.",
poolName, connection, e.getMessage());
return true;
}
}
...
해결방법
스프링에서 다음과 설정을 추가하면 경고 로그는 없어진다.
spring:
datasource:
hikari:
max-lifetime: 177000 # 177초, hikari는 RDS wait_timeout 보다 2 ~ 3초 정도 짧게 줄 것을 권장
hikari CP는 네트워크 지연을 고려하여 max-lifetime을 wait_timeout보다 2~3초 정도 짧게 줄 것을 권고한다.
또는 DB의 wait_timeout 설정을 max-lifetime 보다 길게 설정해줄 수도 있다.
DB의 wait_timeout을 어떻게 확인할 수 있을까?
- MySQL
mysql> SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
Variable_name Value
wait_timeout | 1830 |
- Oracle
SQL>
select PROFILE
, RESOURCE_NAME
, RESOURCE_TYPE
, LIMIT
, COMMON
from dba_profiles
where profile = 'DEFAULT'
order by 1,2;
PROFILE RESOURCE_NAME RESOURCE LIMIT
DEFAULT | IDLE_TIME | KERNEL | 15 |
'지식노트' 카테고리의 다른 글
[DB] MariaDB JDBC Failover 및 Load balancing 설정 (4) | 2024.07.16 |
---|---|
[Oracle] 로컬 인덱스와 글로벌 인덱스에 대하여 (파티션 테이블 인덱스) (4) | 2023.11.01 |
Unable to commit(rollback) against JDBC Connection (0) | 2023.10.11 |
참/거짓(Boolean)을 반환하는 함수명 (3) | 2023.08.21 |
그림과 작동 원리로 쉽게 이해하는 서버의 기초 - 4. 사내 서버 기본 (2) | 2023.06.10 |