MarkLogic模板调试:如何提高生产力?

时间:2011-12-06 19:15:52

标签: marklogic

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

4 个答案:

答案 0 :(得分:2)

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

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

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

可能有不同的原因,但为什么你使用的方法是如此缓慢。如果您能够披露它,您可以要求具体的优化提示。

答案 1 :(得分:1)

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

但假设您只是想重新加载自己的代码,可以使用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))

答案 2 :(得分:1)

使用Marklogic中的技术Ant任务和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>

答案 3 :(得分:0)

如果您只是想让您的模块上传更快:清除模块数据库,关闭&#34;创建目录:自动&#34;,并使用配置了多个线程的RecordLoader之类的东西。如果您没有将目录创建设置为自动写入模块数据库,则会进入锁定争用并实际上是单线程。