AWS에 개발 환경을 구축 하였습니다.
플랫폼 : SpringBoot 3.4.5 (Java 21)
RDS : MariaDB (db.t4g.micro)
EC2 : Amazone Linux 2023 (t3.micro)
로컬에서 개발 하다가 배포 시점이 되어 개발환경에 배포 후 아무 생각없이 로컬에서 DBeaver, intelliJ에서 실행하니까 아래와 같은 에러가 떨어집니다.
Error: 1040-08004: Too many connections
DB 확인
SHOW VARIABLES LIKE 'max_connections';
맥스 커넥션이 30개 밖에 안됩니다.
AWS RDS에 파라메터 그룹 확인
max_connections 에 지정되어 있는 값은 아래와 같은 수식 입니다.
LEAST({DBInstanceClassMemory/25165760},12000)
|
AWS RDS에서 max_connection 값을 DB 인스턴스의 메모리값 기준으로 동적 계산 하는 것으로 추정되며
ChetGTP에 의하면
- DBInstanceClassMemory는 RDS 인스턴스의 총 메모리 용량(byte 단위)
- 25165760은 고정된 수이며, 1 connection이 사용하는 메모리의 평균값(byte)으로 추정
- LEAST(a, b)는 a와 b 중 더 작은 값을 반환.
정확한 계산은 아니지만 어쨌든 현재 개발환경의 MariaDB에 할당된 최대 커낵션 수는 30개 입니다.
파라메터 그룹에서 이것을 조금 큰 숫자로 수정해도 되지만, 혹시 모를 비용 폭탄(?) 문제가 우려되고 커넥션 수를 정확히 조절 하는 것이 향후에도 의미가 있을 것 같아서 몇가지 시도 해 보았습니다.
현재 프로세스 리스트를 확인해 보면
SHOW PROCESSLIST;
222.xxx.xxx.233은 로컬 IP로 DBeaver 에서 접속된 것으로 추정 됩니다. (13개)
172.xxx.xxx.45는 EC2 인스턴스에서 실행한 Springboot 에서 접속된 것으로 추정됩니다. (10개)
현재 프로잭트의 Springboot 설정에 찾아 보니 커넥션 관련 설정은
maximumPoolSize=5
이 것은 Springboot 2.x 에서 사용하던 속성값 인데 3.x로 올라가면서 현재는 적용이 안되어 기본 10개의 커넥션이 생성되는 것 같습니다.
Springboot 3에 맞게 수정하였습니다.
# maximum-pool-size=5 : 연결 풀에서 최대 5개의 연결만 유지
spring.datasource.hikari.maximum-pool-size=5
# #minimum-idle=2 : 최소 2개의 연결 유지
spring.datasource.hikari.minimum-idle=2
# idle-timeout=60000 : 유휴 연결은 1분 뒤 정리
spring.datasource.hikari.idle-timeout=60000
# max-lifetime=1800000 : 연결은 최대 30분 후 교체
spring.datasource.hikari.max-lifetime=1800000
# connection-timeout=30000 : 연결 요청은 최대 30초까지 대기
spring.datasource.hikari.connection-timeout=30000
spring.datasource.kikari.maximum-pool-size 값은 EC2에서는 5개, 로컬에서는 3개만 주었습니다.
그리고 쓸데 없이 커넥션을 10개씩 잡고 있는 DBeaver 도 커낵션을 줄일 수 있는지 ChatGPT에게 물어봤습니다.
ChatGPT는 생각보다 구라를 잘 칩니다 ㅎㅎㅎ DBeaver 구버전 기준의 답변인지 모르겠지만 설명이 틀렸습니다.
어쨌든 SQL 에디터 하나마다 커넥션을 하나씩 먹는다고 하는 것 같습니다.
환경설정 -> SQL 편집기
- Open separate connection for each editor : Default -> Naver 수정
- Connect on editor activation 체크 해제
- Connect on query execute 체크 유지
커넥션 풀 갯수를 조정할 DB 연결의 Edit Connection -> Connection Settion -> Driver properties
중간 쯤에 maxPoolSize, minPoolSize 가 있습니다. (기본 8개)
maxPoolSize=3, minPoolSize=1
조정 결과 기본 연결된 커넥션 수가 확 줄었습니다.
주의!!!
커넥션 풀 수를 줄이는 것은 어플리케이션 속도에 지대한 영향을 미칠 수 있습니다. 운영환경에 적용하기 위해서는 충분한 테스트 한 후 적당한 값을 찾아서 적용해야 합니다.
끝
'DataBase' 카테고리의 다른 글
[MariaDB] 보안 취약점 점검 #9 백업 & 소산 (3) | 2025.06.18 |
---|---|
[MySQL, MariaDB] 최초 설치 후 외부 접속 시 Connection refused: getsockopt 발생하는 경우 체크 (0) | 2025.06.02 |
[AWS] RDS - MySQL/MariaDB 테이블 명 대소문자 구분(lower_case_table_names) 문제 (0) | 2025.04.30 |
[MariaDB] 보안 취약점 점검 #8 감사 로그 관리 (0) | 2025.03.13 |
[MariaDB] 보안 취약점 점검 #7 감사 정책 준비 (0) | 2025.03.01 |