문제 현상
서버에서 Connection Error 가 나타나고 정상적으로 동작하지 않았다.
[Hikari Pool - Common] - Connection is not available, request timed out after 30007ms.
디버그 모드로 확인해보니 postgresql 동시 접속자 수를 초과했다는 에러가 발생한다.
[Hikari Pool - Query] - Exception during pool initialization.
org.postgresql.util.PSQLException: 치명적오류: 최대 동시 접속자 수를 초과했습니다.
혹은
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
문제 원인
Database 에 설정된 max_connection 을 모두 사용해서 추가 connection 을 생성할 수 없어서 발생한 오류이다.
* max_connection 확인 SQL
show max_connections;
해결방법
Database 의 max_connection 설정을 늘린다.
※ Database 설정 값을 수정해야 하므로 PostgreSQL 재시작이 필요하다
PostgreSQL의 기본 max_connections 설정값과 이를 조정하는 방법에 대한 자세한 설명은 How to Increase Max Connections in PostgreSQL 를 참고하세요.
1. PostgreSQL 설정 파일을 연다.
설정 파일 위치를 모를 경우, `show config_file;` 을 실행하여 파일 위치를 파악한다.
2. max_connections 설정 값을 수정한다.
max_connections = 200
기존 100 에서 200으로 늘려주었다.
3. PostgreSQL 서버를 재시작한다.
sudo service restart postgresql
서비스를 재실행하려고 하자 에러가 발생했다.
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
서비스 명령어를 잘못 입력했는지 systemctl 을 사용하라고 한다.
* postgresql 관련 systemctl 명령어 조회
systemctl list-units|grep postgresql
조회해보니 postresql 이 아닌 postgresql-12.service 여서 정정하여 명령어를 수행했다.
systemctl restart postgresql-12.service
4. max_connections 설정 값을 증가시킨 뒤, 정상적으로 DB connection 이 맺어지는 것을 확인했다.
대안방법
단순히 max_connections를 늘리는 것 외에도, 상황에 따라 다음과 같은 방법들을 고려해볼 수 있다.
- Connection Pool 크기 조정
- HikariCP와 같은 Connection Pool을 사용 중이라면, Pool 크기 설정을 최적화하여 데이터베이스에 대한 연결 요청을 효율적으로 관리할 수 있다.
- 예: maximumPoolSize 값을 조정하여 필요한 만큼의 연결만 유지
- 비효율적인 연결 요청 최소화
- 애플리케이션 코드에서 불필요하게 많은 연결을 생성하지 않도록 최적화한다.
- 예: 사용하지 않는 연결을 즉시 반환하거나, 장기 실행 쿼리를 분리하여 적정 수준의 연결 수를 유지
추가적인 질문이 있다면 댓글로 남겨주세요.