问题:
使用 WAR 文件(在 WEB-INF/classes 中)部署 XCC 库会禁止在不重新启动整个 Tomcat 容器的情况下重新部署/更新该 web 应用程序。它只是停止工作,因为仍然分配了资源,因此 Tomcat 无法删除一些 JAR 文件。
在 Tomcat 的 lib 目录中部署库时(作为 JDBC 驱动程序),Tomcat 在 Tomcat 日志中写入内存泄漏警告,如下所示:
17-Mar-2016 10:58:45.683 WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [api] appears to have started a thread named [Thread-4] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Thread.sleep(Native Method) com.marklogic.xcc.ContentSourceFactory$ConnectionCollector.run(ContentSourceFactory.java:449)
我发现了什么:
我做了一些调查,发现(至少在 XCC 8.0.3 中)在 ContentSourceFactory 中启动了一个从未关闭的线程。该线程正在影响 servlet 的更新/重新部署并造成内存泄漏。我的快速解决方案是创建一个自定义 ContentSourceFactory,它有一个在 servlet 停止时调用的关闭方法。
问题:
不幸的是,我在文档中没有找到任何线索。那么在 servlet 容器中使用 XCC 库(8.x)的官方方法是什么?