저는 과거의 악몽같은 경험 때문에 sql connection을 다룰 때 항상 조심합니다. 한 프로젝트에서, 10번 정도의 request 이후에는 mysql이 매우 매우 느리게 (대략 20초 정도 지연해서) 동작하는 현상이 발생했었는데, 그게 바로 sql connection을 실수로 닫아주지 않아서 생긴 일이었기 때문입니다.
다만 자세한 원인은 기억이 나지 않았습니다. 이제와서 생각하는 것이지만 mysql의 max_connections
기본값은 150인데, 왜 150번의 request가 아니라 10번만에 뻗었을까요...? 궁금증을 못 참고 당시 진행하던 프로젝트의 git repo를 다시 다운 받고, 해당 오류가 났던 커밋으로 git reset한 뒤 오류를 재생산해보았습니다.
오류의 정확한 원인은 다음과 같았습니다.
공식 문서: Never keep references to a SqlSession instance in a static field or even an instance field of a class.
poolMaximumActiveConnections
는 기본값이 10으로 설정되어 있습니다.06:16:57.062 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource -- Waiting as long as 20000 milliseconds for connection.
상당히 당황스러운 케이스였습니다.
해당 오류 메세지는 logging.level = debug 으로 설정된 상태에서 로그를 출력해야만 보이는데, 내용이 비어 있는 logback.xml 파일이 프로젝트에 생성이 되어 있으면 log가 출력이 전혀 되지 않는 것을 몰랐습니다. logback.xml 파일을 지우니까 정상 동작하기 시작했습니다.