问题:
使用 WAR 文件(在 WEB-INF/classes 中)部署 XCC 库会禁止在不重新启动整个 Tomcat 容器的情况下重新部署/更新该 Web 应用程序。它只是停止工作,因为仍然分配了资源,因此 Tomcat 无法删除一些 JAR 文件。
当在 Tomcats 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) 的官方方法是什么?
最佳答案
该线程似乎在 JVM 的持续时间内运行。我将为此打开一个缺陷。
基于 tomcat 中不同产品的类似问题的经验的解决方法。数据库驱动器(尤其是 JDBC)历史上一直存在这样的问题。
将 xcc.jar 放入 tomcat 的“共享库”类路径中,而不是放在 WAR 中。一般情况下不建议这样做——但这正是存在共享库类路径的原因——这允许重新部署您的应用程序。 XCC 代码是线程安全且与上下文无关的,只要您自己不共享事件连接对象,它就应该可以正常工作。
还要确保您认真关闭或关闭所有响应对象,终结器可能需要很长时间才能启动。
-大卫
关于marklogic - 如何在 Apache Tomcat 中部署 Marklogic XCC 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36065226/