C # Cache Saxon Compiler и исполняемые объекты

xml c#-4.0 saxon

81 просмотра

1 ответ

8 Репутация автора

Использование приведенного ниже кода для запуска оценок с использованием SaxonCA API

Task newTask = Task.Run(() =>
{
    Processor processor = new Processor();
    DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
    documentBuilder.IsLineNumbering = true;
    documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
    XQueryCompiler compiler = processor.NewXQueryCompiler();
    string query = BuildXqueryString();

    if (!String.IsNullOrEmpty(query))
    {
        XQueryExecutable executable = compiler.Compile(query);
        XQueryEvaluator evaluator = executable.Load();
        evaluator.ContextItem = documentBuilder.Build(xmlNode);
        var evaluations = evaluator.Evaluate();
    }
}

Запросы (Xquery) являются постоянными и никогда не меняются, пока не появится новая сборка. Выше код выполняется параллельно для разных документов. Хотел проверить, есть ли какой-нибудь способ кэширования объекта компилятора / оценщика, чтобы избежать компиляции запросов для каждого документа, который мы обрабатываем.

Любая помощь будет оценена.

Автор: Pramod Almeti Источник Размещён: 18.07.2016 03:14

Ответы (1)


1 плюс

119061 Репутация автора

Решение

Он XQueryExecutableявляется неизменяемым и поточно-ориентированным , поэтому вы можете безопасно его кэшировать: например, сохраняя (поточно-ориентированную) карту или хеш-таблицу от строки запроса до XQueryExecutable. Единственное предостережение заключается в том, что вам придется изменить способ создания экземпляра объекта Processor: вместо создания нового Processor при каждом запуске запроса у вас должен быть один объект Processor для всего приложения, поскольку скомпилированный запрос и источник Документ должен быть построен под контролем того же Процессора.

XQueryCompilerСерийно многоразовый, но так как ErrorListобъект обновляется в процессе компиляции, он не должен быть использован в более чем одной нити одновременно. Таким образом, вам может быть проще создать новый XQueryCompilerкаждый раз, когда вы компилируете запрос.

Автор: Michael Kay Размещён: 18.07.2016 07:51
Вопросы из категории :
32x32