-
SQLTransientConnectionException ???스프링 2022. 7. 12. 23:57
소켓으로 다수의 채팅방을 만들어 다수의 사용자가 실시간 통신을 할 수 있게하는 프로젝트를 구현하다가
서버단에서 맞닥드리게된 에러이다.
jpa가 아닌 기존 jdbc의 Connection 객체를 활용해 클라이언트가 보낸 메세지를 서버에 저장하던 중 20개 정도 이상의 메세지를 보내면
서버에서 해당 에러가 발생했다.
구글링을 해보니 원인은 컴퓨터 내부에서 dead lock(교착 상태)가 발생한것이라는데,
교착상태란 여러개의 프로세스나 스레드가 서로 배타적 접근을 하여 서로 갖고있는 자원을 요구하게되고 진전 없이 그 상태가 지속됨을 의미한다.
살펴보니 jdbc에서는 repository 클래스에서 db와 통신할 때 Connection객체를 생성해 쿼리를 수행하는데
내가 작성한 코드에는 쿼리를 수행한 후 Connection객체를 종료하지않고 바로 메소드가 종료되게 되어있었다.
우리의 컴퓨터는 무한정 자원을 생산할 수 없으므로,
후속되는 요청들이 해당 반환되지 않은 자원들을 요구하다가 일정 시간이 지나 db와의 통신이 끊어지게되는것이다.
따라서 메소드가 종료되기 전 Connnection객체.close()를 사용하여 해당 자원을 반환해주면 위의 에러는 발생하지않을것이다.
밑의 블로그를 참고해 이슈를 해결했고 해당 링크에서 더 자세한 설명을 확인할 수 있다.
'스프링' 카테고리의 다른 글
프로젝트를 하며 마주친 ConcurrentModificationException (0) 2022.05.06 스프링부트에서 HttpResponse 헤더 객체를 React Client에 보내기. (0) 2022.04.25