marklogic - 如何在 Apache Tomcat 中部署 Marklogic XCC 库?

标签 marklogic marklogic-8

问题:
使用 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/

相关文章:

marklogic - 获取附加到特定数据库的所有林的总大小

xpath - Marklogic - 使用获取属性值的 Xpath

xquery - 以 cts 为单位设置日期时间格式 :element-values

search - 具有复杂逻辑或替代方案的自定义约束

nosql - MarkLogic:在单个事务中提交多个语句

xpath - MarkLogic - 在不使用 Xpath 的情况下获得不同的结果集

node.js - MarkLogic 8 - node.js API - 将 XML 转换为 JSON

Marklogic XCC 或 JAVA/REST

json - 将同名的 XML 元素转换为同名的 JSON 属性

node.js - Marklogic 8 Node.js API - 如何在 root 的属性子级上进行搜索?