에러 메세지
No operations allowed after connection closed
에러 원인
PreparedStatement pst = mysql.prepareStatement(query);
위의 코드에서 에러가 발생했는데, 에러 원인은 Connection 객체가 연결 해제됐거나. PreparedStatement 이 이상하거나 둘 중 하나라고 생각했는데, connection closed이기 때문에 Connection의 인스턴스인 mysql이 연결 해제된 후에 pst를 사용하여 쿼리를 실행하려 했기 때문인 것 같다.
만약 No operations allowed after statement closed 이라면 statement객체를 의심해봐야 할 것이다.
해결
처음에는 아래와 같이 해결하고자 했다.
String jdbc_url = "jdbc:mysql://" + url ":"
+ port + "/"
+ dbname + "?useSSL=false"
+ "&serverTimezone=Asia/Seoul"
+ "&useUnicode=true"
+ "&characterEncoding=UTF-8"
+ "&autoReconnect=true"
+ "&validationQuery=select 1";
autoReconnect=true로 reconnect를 auto로 수행하던가, validationQuery=select 1을 사용해 해결하려 하였으나 아래와 같은 문제가 있었다.
autoReconnect는 첫 쿼리를 수행한 다음 DB세션에 문제가 있으면 SQLException을 리턴 후 재접속 처리를 한다. 그렇기 때문에 트랜잭션 구동 환경에서 수행중인 트랜잭션은 롤백이 되어야하고 남은 트랜잭션은 수행되지 않아야 할 때 예외 발생의 경우에 해당 트랜잭션이 진행되지 않게 예외처리를 반드시 해주어야 한다.
validationQuery=select 1은 연결 시, 해당 쿼리를 먼저 수행하여 커넥션 확인을 하기 때문에 쓸데없는 쿼리 하나를 더 수행하는 것이므로 쓸데없는 메모리 낭비, 크게 보면 부하가 걸릴 수 있다.
내 코드는, DB Connect를 위한 클래스 하나, 공통 설정 클래스 하나, Log 클래스 하나, 로직을 수행하는 클래스 하나, 총 네 개의 클래스가 연동되어 돌아가는 App이다.
별 수 없이 일일이 하나하나 로직을 뜯어보며 어디서 Connection이 close되는지, connect되는지 확인하여 두 세시간 작업한 끝에 찾을 수 있었다. 반복적으로 엄청 많은 작업을 해야되는 App이었는데, 한 번 수행하고 다음 수행 작업을 할 때 Connection이 close되었다가 다시 connect되지 않았던 것이다.
요약하자면, 결국 Connect이 되어 있는지, 안되어 있는지, 잘 파악하면 된다.
인수인계 받은 코드에 작업을 한 것이라. 주석처리가 하나도 되어있지 않아서 일일이 뜯어보며 작업했다.
이번 트러블슈팅 과정에서 주석처리가 너무 아쉬웠다.
나도 누군가에게 코드 인수인계를 대비하고, 나조차도 코드를 잘 알아보기 위해
주석처리를 열심히 해야겠다는 생각이 들었다
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!