programing

웹 응용 프로그램 []이(가) [Abandoned connection cleanup thread] com.mysql.jdbc라는 이름의 스레드를 시작한 것으로 보입니다.버려진 연결 정리실

telebox 2023. 10. 4. 21:15
반응형

웹 응용 프로그램 []이(가) [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

반응형