웹 응용 프로그램 []이(가) [Abandoned connection cleanup thread] com.mysql.jdbc라는 이름의 스레드를 시작한 것으로 보입니다.버려진 연결 정리실
웹 개발 중에 일식 IDE에서 웹 앱을 닫습니다. 약 1분 동안 일식 콘솔에서 경고가 표시되었습니다.
WARNING: The web application [/Spring.MVC] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Sep 06, 2014 8:31:55 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
WARNING: The web application [/Spring.MVC] 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. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(Unknown Source)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40)
Sep 06, 2014 8:32:00 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sep 06, 2014 8:32:00 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 06, 2014 8:32:03 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: personPU
...]
지금까지 메모리 누수가 발생하지 않았으며 VisualVM을 확인했습니다. 모든 것이 정상적으로 작동하지만 이에 대해 더 자세히 검색하면 MySQL 드라이버가 리소스를 해제하지 않거나 제대로 닫히지 않아 이 경고가 발생한다는 것을 알게 되었습니다(정확하게 말하는 방법을 모르겠습니다). SO 관련 문제로 이 게시물을 게시하게 되었습니다.
그리고 OP가 옳습니다. "걱정하지 마세요"라는 대답으로는 충분하지 않을 것입니다.이 경고는 향후 지속성 문제를 일으킬 수 있기 때문에 신경 쓰입니다. OP가 작성한 코드를 시도했지만 이 코드가 작동하려면 라이브러리를 사용해야 하는 문제가 있습니다.이게 제가 지금까지 얻은 것입니다.
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.hibernate.annotations.common.util.impl.LoggerFactory;
import com.mysql.jdbc.AbandonedConnectionCleanupThread;
@WebListener
public class ContextFinalizer implements ServletContextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ContextFinalizer.class);
public void contextInitialized(ServletContextEvent sce) {
}
public void contextDestroyed(ServletContextEvent sce) {
Enumeration<Driver> drivers = DriverManager.getDrivers();
Driver d = null;
while (drivers.hasMoreElements()) {
try {
d = drivers.nextElement();
DriverManager.deregisterDriver(d);
LOGGER.warn(String.format("Driver %s deregistered", d));
}
catch (SQLException ex) {
LOGGER.warn(String.format("Error deregistering driver %s", d), ex);
}
}
try {
AbandonedConnectionCleanupThread.shutdown();
}
catch (InterruptedException e) {
logger.warn("SEVERE problem cleaning up: " + e.getMessage());
e.printStackTrace();
}
}
}
필요한 라이브러리가 무엇인지 알고 싶을 뿐입니다. 또는 이를 제대로 구현하기 위해 적절한 라이브러리를 사용하고 있다면 Logger를 사용해야 하는지도 모릅니다. 도움을 주셔서 감사합니다.
이 답을 보세요.MySQL 드라이버가 있어야 할 것 같습니다.{$TOMCAT]/lib
애플리케이션 간에 공유할 수 있습니다.각 응용프로그램에 포함되지 않았는지 확인합니다.적어도 그것은 저에게 효과가 있었고 저는 경고를 없앨 수 있었습니다.
메이븐을 사용하는 경우 제공된 대로 종속성에 표시합니다.
업데이트:
근본적인 원인은 Tomcat이 여러 애플리케이션에 공통적으로 단일 톤으로 등록되어 있기 때문에 드라이버를 가비지 콜렉트하는 데 문제가 있기 때문입니다.응용 프로그램 하나를 닫으면 Tomcat이 드라이버를 해제할 수 없습니다.이 답을 보세요.
저는 mysql(service mysql start)을 중지한 다음 tomcat(./shutdown)을 중지합니다.sh) bin 폴더에서 문제가 해결되었습니다.
저는 이 정도면 돼요.
문제는 저의 경우 탄력적인 조사였습니다.
우체부에서 DELETE 요청을 엔드포인트 아래로 보내고 응용프로그램을 다시 시작합니다.
http://localhost:9200/*
언급URL : https://stackoverflow.com/questions/25699985/the-web-application-appears-to-have-started-a-thread-named-abandoned-connect
'programing' 카테고리의 다른 글
(1) vs (True) -- (python 2 바이트 코드에서) 왜 차이가 나죠? (0) | 2023.10.04 |
---|---|
리캡차 스타일링이 깨졌습니다. (0) | 2023.10.04 |
쿼리 진행 상황 확인(Oracle PL/SQL) (0) | 2023.10.04 |
행 대 장조 대 열 대 장조 혼동 (0) | 2023.10.04 |
최소 8자, 숫자 1개, 대문자 1개, 소문자 1개를 포함하는 비밀번호용 javascript regex (0) | 2023.10.04 |