Programming

[Spring Tomcat] failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

통통만두 2023. 3. 22. 08:43
반응형

기존 Java Spring로 배포할 때 Tomcat를 재기동하는 방식으로 하고 있었는데, 톰캣이 내려갔다가 다시 올라오는 사이에 서비스 단절이 발생해서 이 것을 어떻게 단절 없이 배포할 수 없을까 고민하다가 Tomcat Parallel Deployment를 적용해서 톰캣의 재시작 없이 Context만 바꿔치기(?)하는 형식으로 변경을 해서 무중단 배포를 적용하게 되었다.

톰캣의 중단 없이 Context가 잘 바뀌긴하는데 기존 Context가 떠 있는 상태에서 새로운 Context가 로드되고, 완전한 교체가 이루어진 다음 기존 Context가 내려갈 때 아래와 같은 톰캣 로그가 발생했다.

심각: The web application [##20230320161639] registered the JDBC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
3월 21, 2023 10:17:36 오전 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
심각: The web application [##20230320161639] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.

 

아래와 같은 키워드로 검색하면 원인과 해결방법에 대해서 많이 나오니 참고부탁드리겠습니다.

failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

 

대부분의 해결책에서 spring에서 사용하는 jdbc관련 라이브러리를 tomcat/lib 폴더에 넣어두는건데 나는 이 방법으로는 해결되지 않아서 엄청나게 찾아 본 결과 DriverManager을 통해서 해결을 했다.

@Component
public class GracefulDestory {

    @PreDestroy
    public void destory() {
        Enumeration<Driver> drivers = DriverManager.getDrivers();

        while (drivers.hasMoreElements()) {
            Driver driver = drivers.nextElement();
            try {
                DriverManager.deregisterDriver(driver);
            }
            catch (SQLException e) {
                //
            }
        }
    }

}

 

Spring에 종료 시그널이 들어왔을 때 DriverManager을 통해서 해제를 하니 Tomcat의 메모리 누수문제는 해결되었다.

반응형

'Programming' 카테고리의 다른 글

템플릿 ? ㅋㅋ  (0) 2010.12.16