MarkLogic: переключение между базами данных с помощью xdmp.eval - PullRequest
0 голосов
/ 18 марта 2019

MarkLogic версия: 9.0-6.2

У нас есть собственный REST API, который читает документ из STAGING, затем обновляет несколько документов в FINAL, а затем запускает xdmp.documentRemoveCollections для документа STAGING.

Шаг 1: Начните с STAGING DB. Прочитайте документ

Шаг 2: Переключиться на FINAL DB, применить изменения к нескольким документам в FINAL DB

Шаг 3: Переключитесь на STAGING DB, примените xdmp.documentRemoveCollections к документу, считанному на шаге 1

Мы используем xdmp.eval для переключения между базами данных, но заметили, что время ожидания службы истекло, вероятно, из-за переключения между базами данных. (например, если мы удалим шаг xdmp.documentRemoveCollections, то у службы не будет тайм-аут, вероятно, потому что ему не нужно переключаться с FINAL на STAGING)

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

Пожалуйста, предложите, если есть какие-либо меры предосторожности, которые необходимо соблюдать в CUSTOM REST API, чтобы избежать тайм-аута при переключении между базами данных туда и обратно.

Заранее спасибо!

1 Ответ

0 голосов
/ 18 марта 2019

Тайм-аут в этом случае, вероятно, из-за чтения и записи в тот же документ в той же транзакции. Шаг 3 не должен включать «Переключение» БД, он должен быть уже в той же БД, единственным переключателем является шаг 2. Этот рабочий процесс может легко заблокироваться без особого внимания. Шаг 2 должен быть синхронным? если нет, предложите поставить его в очередь на сервере задач. 1,3 должны быть в той же транзакции? Шаг 1, вероятно, удерживает блокировку на прочитанных документах, а затем шаг 3 пытается дождаться освобождения этой блокировки для обновления. Попробуйте сделать шаг 1 транзакцией чтения и убедитесь, что он остается таким же до шага 3. Вы можете полностью изолировать их, выполняя ВСЕ шаги в суб-транзакциях (индивидуально). Рекомендовать использовать invoke-function (или module) вместо eval (со строками) - легко получить поведение «xquery инъекция» (от друга или врага), используя eval («некоторая строка, которую я построил путем конкатенации пользовательского ввода»)

Выполняете ли вы это одновременно с другими действиями (один и тот же вызов REST или разные вызовы в одно и то же время для одной и той же БД).

Используйте 'консоль запросов', чтобы узнать, какие транзакции открыты в какое время. Если вы видите «зависание», то почти наверняка вы обнаружите открытую транзакцию.

...