【问题标题】:MarkLogic template debugging: how to increase productivity?MarkLogic 模板调试:如何提高生产力?
【发布时间】:2011-12-11 04:32:11
【问题描述】:

我正在尝试调试 MarkLogic 管道,每次我更改管道使用的一个 xquery 文件时,我都必须运行一个自制脚本,该脚本会重新加载所有系统模块。我猜这是在项目只有几个模块时开发的技术,但现在这个过程需要几分钟。我需要的是 1)一种更快的技术来重新加载我更改的一个模块,例如我可以在 CQ 中运行的代码 sn-p 或 2) 一些完全不同的方法。谢谢。

【问题讨论】:

    标签: marklogic


    【解决方案1】:

    通常您可以直接从文件系统运行代码,但这不适用于管道。

    第二个最简单的方法是使用 webdav 应用服务器和支持 webdav 的编辑器(如 oXygen)。您需要做的就是创建一个新的 webdav 类型的应用服务器,将其连接到您要访问的模块数据库,确保您有一个可以登录的帐户,并且您已准备好。

    其他方法是使用更智能的系统仅上传更改的文件。 Ant 通常非常擅长检测变化。并且在 github (https://github.com/garyvidal/marklogic-ant-tasks) 上有可用的 MarkLogic 蚂蚁任务。虽然不确定这是否真的更好,但您必须尝试。您可能必须仔细考虑您的构建脚本。上次我使用它时,它运行得相当好,当然不是几分钟,即使它加载了几百个文件,如果我没记错的话。

    虽然您使用的方法如此缓慢,但可能有不同的原因。如果你能透露出来,你可以要求具体的优化技巧。

    【讨论】:

    • 如何通过 WebDAV 连接来解决 ML 必须转储模块的缓存(或者不管它做什么,编译?)的问题?谢谢!
    • 据我所知,模块在首次访问(初始或更新后)时被编译和缓存。它不应该减慢更新 AFAIK。对于您用于更新模块的所有方式,该行为都是相同的,因此对于将 WEBDAV 上传到模块数据库的方式没有什么不同..
    【解决方案2】:

    我对重新加载“所有系统模块”的需要感到有些困惑。也许您应该尝试最新的服务器版本,或者与支持人员联系?

    但假设您只是想重新加载自己的代码,您可以使用 RecordLoader:https://github.com/marklogic/recordloader

    如果您更愿意使用 cq,您可以从 http://developer.marklogic.com/pubs/4.2/apidocs/AdminBuiltins.html#xdmp:filesystem-directory 开始 - 这可能会让您开始。您可能需要向 doc-insert 调用添加文档权限,并且您可能需要执行更多字符串操作来构建 URI。

    declare namespace dir="http://marklogic.com/xdmp/directory";
    
    if (xdmp:database('Modules') eq xdmp:database()) then ()
    else error(
      (), 'INSTALL-NOTMODULES', text {
        xdmp:database-name(xdmp:database()), 'is not the Modules database' })
    ,
    for $i in xdmp:filesystem-directory('/path/to/files')/dir:entry
      [dir:type eq 'file']
      [ends-with(dir:filename, '.xqy')]
    let $uri := $i/filename/string()
    return xdmp:document-insert($uri, xdmp:document-get($i/dir:pathname))
    

    【讨论】:

    • 抱歉我的帖子不清楚:底线是我只需要一种有针对性的方法来重新加载我正在处理的一两个 xqy 文件。ML 是否只需要重新插入文件从文件系统进入数据库?我会看看 RecordLoader。我继续对几乎没有工具的极其陈旧的开发环境感到沮丧……我离题了。我使用 Oxygen 而不是 CQ,这样至少我可以获得语法颜色突出显示。再次感谢。
    • 我想我心中真正的问题是为什么我可以修改一些xqy文件并立即看到结果;但是显然对于管道所触及的任何 xqy 文件,这都行不通——而且我不清楚究竟需要做什么来解决这个问题。
    • CPF 管道由触发器实现,这些 CPF 触发器评估其模块根集到模块数据库。因此,安装触发器使用的代码的正常方法是将其复制到 Modules 数据库中。另一方面,应用程序服务器可以使用文件系统位置作为其根。一种替代方法是使用 /opt/MarkLogic/Modules (在 linux 上 - 其他环境不同)。该文件系统位置中的模块是普遍可用的。
    【解决方案3】:

    使用 Marklogic Ant Tasks 中的技术和 XCC 连接(任何都不必指向您的数据库): https://github.com/garyvidal/marklogic-ant-tasks

    您可以使用以下是您可以在模板中使用的内容:

    <!--Define ml namespace in project root element-->
    <project name="ML Build Task" xmlns:ml="http://www.marklogic.com/ant">
    >
    <!--Set you the classpath to where your mlant.jar file is located.
        Include any other dependent jar files required to execute tasks
        noted in Dependencies section.
    -->
    <path id="mlant-classpath">
        <fileset dir="${lib-dir}">
              <include name="xcc.jar" />
              <include name="mlant.jar" />
              <include name="corb.jar"/>
              <include name="saxon9he.jar"/>
              <include name="xqdoc-ml.jar"/>
              <include name="antlr-2.7.5.jar"/>
        </fileset>
    </path>
    <!--
       Setup the type definition and assign classpathref to mlant-classpath
    -->
    <typedef 
       uri="http://www.marklogic.com/ant" 
       resource="com/marklogic/ant/antlib.xml"
       classpathref="mlant-classpath"
    />
    <!--Optional: Set the property for xccstring used to connect to MarkLogic database-->
    <property name="xccstring" value="xcc://test:test@localhost:9090/Docs">
    
    <!--Create a target element and use the tasks-->
    <target name="load-modified">
         <ml:load xccurl="${xccstring}">
              <ml:docset destdir="/app-code/">
                  <ml:permissionset>
                      <ml:permission role="nobody" permission="execute" />
                      <ml:permission role="nobody" permission="insert" />
                      <ml:permission role="nobody" permission="read" />
                      <ml:permission role="nobody" permission="update" />
                  </ml:permissionset>
                  <ml:collectionset>
                      <ml:collection name="collection1" />
                      <ml:collection name="collection2" />
                  </ml:collectionset>
                  <fileset dir="../src" includes="**/*" >
                     <modified/>
                  </fileset>                  
              </ml:docset>
          </ml:load>
    </target>
    
    <!--Have Fun-->
    </project>
    

    【讨论】:

      【解决方案4】:

      如果您只是想让您的模块上传速度更快:清除您的模块数据库,关闭“目录创建:自动”,并使用配置多线程的 RecordLoader 之类的东西。如果您不将目录创建设置为自动写入模块数据库,则会陷入锁定争用,并且实际上是单线程的。

      【讨论】:

        猜你喜欢
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多