본문 바로가기

개발/Java

[Tomcat] 웹어플리케이션(WAR) 구동시 SQLServer JDBC memory leak 에러발생

728x90
반응형

 

톰캣 구동시 SQLServer JDBC memory leak 에러가 발생하면서 서비스 구동실패

환경정보

  • 윈도우 서버 2012 R2
  • JDK 11
  • Tomcat 8.5

증상

catalina.log 확인결과 SQLServer JDBC memory leak 에러가 발생하면서 톰캣 서비스 구동이 실패하는 증상발생

09:34:42.476 INFO [Thread-12] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
09:34:42.535 INFO [Thread-12] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
09:34:42.578 INFO [Thread-12] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
09:34:43.418 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] 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.
09:34:43.583 INFO [Thread-12] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
09:34:43.583 INFO [Thread-12] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
09:34:43.645 INFO [Thread-12] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
09:34:43.645 INFO [Thread-12] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]

원인

JDK 11로 개발/운영환경이 설정되어 있으나 SQLServer JDBC는 JDK 8 버전으로 설정되어 있어 발생하는 것으로 파악됨. - mssql-jdbc-6.4.0.jre8.jar

해결방법

JDK 11을 지원하는 JDBC 로 변경하여서 해결완료(mssql-jdbc-6.4.0.jre8.jar -> mssql-jdbc-10.2.0.jre11.jar)

<!-- maven - pom.xml 설정 -->
<dependency>
	<groupId>com.microsoft.sqlserver</groupId>
	<artifactId>mssql-jdbc</artifactId>
	<version>10.2.0.jre11</version>
</dependency>

정리

JAVA가 하위호환이 아주 잘되어 있지만 설정되어 있는 자바버전과 어플리케이션의 라이브러리들의 버전을 맞추어 주는 것이 가장 좋은듯 하다.

 

728x90
반응형