(1)

[JDBC] DB Connection ERROR / No operations allowed after connection closed

에러 메세지 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객체를 의심해봐야 할 것이다. 해결 처음에는 아래와 같이 해결하고자 했..

[JDBC] DB Connection ERROR / No operations allowed after connection closed

Tech/트러블슈팅 2023. 5. 25. 16:33
728x90
728x90

에러 메세지

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이 되어 있는지, 안되어 있는지, 잘 파악하면 된다.

 

인수인계 받은 코드에 작업을 한 것이라. 주석처리가 하나도 되어있지 않아서 일일이 뜯어보며 작업했다.

 

이번 트러블슈팅 과정에서 주석처리가 너무 아쉬웠다.

 

나도 누군가에게 코드 인수인계를 대비하고, 나조차도 코드를 잘 알아보기 위해

 

주석처리를 열심히 해야겠다는 생각이 들었다 

 

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록