회사에서 기존에 진행하던 프로젝트를 리뉴얼하는 작업을 하게 되어 개발환경을 설정하고 리뉴얼을 막 시작했는데, Dbeaver에서 해당 프로젝트의 개발서버 db가 접속이 되지 않는 이슈가 발생했다.
fatal: remaining connection slots are reserved for non-replication superuser connections
라는 에러코드였고, 이는 슈퍼유저 연결용을 제외한 커넥션 슬롯이 가득 찼다는 의미였다.
처음엔 내가 수정할 수 있는 문제인줄 알고 찾아보면서 db 설정도 확인해보고 했으나, 회사 db 관리는 서버를 관리 하시는 분이 총괄 하시는 게 생각나 확인 요청 드려서 해결했다.
그러나 찾아보면서 알게 된 내용을 정리해두면 좋을 것 같아 작성한다.
자바에서는 JDBC(Java Database Connectivity)라는 데이터베이스에 좁속할 수 있도록 하는 API가 있다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
DB를 사용하기 위해 DB와 애플리케이션간 통신할 수 있는 수단으로, DB Connection에는 Database Driver와 Database 연결 정보를 담은 URL이 필요하다.
웹 컨테이너(WAS)가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 오면 Connection 객체를 빌려주고 해당 객체의 임무가 완료되었을 때 다시 Connection 객체를 반납받아 pool에 저장하는 프로그래밍 기법이다.
나는 직접 db를 수정할 권한이 없었기 때문에 요청해서 해결했지만, 보통 이런 문제에서는 Connection Pool을 늘려주는 방법을 자주 사용하는 것으로 보였다. 다만 Connection Pool의 권장 크기는 아래와 같이 정의하고 있다.
1 connections = ((core_count) * 2) + effective_spindle_count)
위의 문제를 해결하자마자 바로 해당 프로젝트의 db를 마이그레이션 해서 새로운 접속 정보를 주셨다. 여태까지는 연결되어 있는 프로젝트만 받아서 작업하다가 새로 연결하게 되어 스프링 환경에서 연결 방법을 찾아보고 수정했다.
새로운 db도 같은 DBMS를 사용하고 있었기 때문에 기존 설정파일은 건들 것이 없었고, local과 dev의 yml 파일에 db 정보만 변경 후 재빌드 하면 됐다.
생각보다 간단해서 새로 db를 연결하는 방법에 대해서도 찾아보았는데, 처음에 build.gradle에 사용할 DBMS와 관련된 것만 설정하고 db 접속정보를 그대로 yml에 넣으면 그대로 사용할 수 있는 것을 알 수 있었다.