Отладка шаблона MarkLogic: как повысить производительность? - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь отладить конвейер MarkLogic, и каждый раз, когда я изменяю один из файлов xquery, который используется конвейером, мне приходится запускать наш домашний скрипт, который перезагружает ВСЕ системные модули. Я предполагаю, что это метод, который был разработан, когда в проекте было всего несколько модулей, но теперь для этого требуется несколько минут. То, что мне нужно, это либо 1) более быстрая техника для перезагрузки только одного модуля, который я изменил, например фрагмент кода, который я мог бы запустить в CQ или 2) совершенно другой подход. Спасибо.

Ответы [ 4 ]

2 голосов
/ 06 декабря 2011

Обычно вы можете запускать свой код непосредственно из файловой системы, но это не будет работать с конвейерами.

Второй простой способ - это просто использовать сервер приложений webdav и редактор с поддержкой webdav (например, oXygen).).Все, что вам нужно сделать, это создать новый сервер приложений типа webdav, подключить его к базе данных модулей, к которой вы хотите получить доступ, убедиться, что у вас есть учетная запись для входа в систему, и вы готовы.

Другоеподходы используют более разумную систему для загрузки только измененных файлов.Муравей обычно довольно хорошо обнаруживает изменения.А на github доступны муравьиные задания MarkLogic (https://github.com/garyvidal/marklogic-ant-tasks).Хотя не уверен, что это действительно работает лучше, вам придется попробовать.Возможно, вам придется хорошо продумать сценарий сборки.В прошлый раз, когда я использовал его, он работает достаточно хорошо, хотя, конечно, не минуты, хотя он загружал несколько сотен файлов, если я не ошибаюсь.

Может быть и другая причина, почему вы используете такой подходмедленный.Если вы можете раскрыть его, вы можете попросить конкретные советы по оптимизации.

1 голос
/ 07 декабря 2011

Использование техники в задачах 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>
1 голос
/ 07 декабря 2011

Меня немного смущает необходимость перезагрузки "ВСЕХ системных модулей".Может быть, вам стоит попробовать последнюю версию сервера или проверить с поддержкой?

Но если вы просто хотите перезагрузить свой собственный код, вы можете использовать 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))
0 голосов
/ 11 декабря 2011

Если вы просто хотите ускорить загрузку своих модулей: очистите базу данных модулей, отключите «создание каталога: автоматически» и используйте что-то вроде RecordLoader с несколькими настроенными потоками.Если вы не настроите автоматическое создание каталога для записи в базу данных модулей, это приведет к конфликту блокировок и фактически будет однопоточным.

...