C# 缓存 Saxon 编译器和可执行对象

C# Cache Saxon Compiler and Executable objects

使用以下代码 运行 使用 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) 是不变的,在有新版本之前永远不会改变。上面的代码对于不同的文件是运行并行的。想检查是否有任何方法可以缓存 compiler/evaluator 对象以避免对我们处理的每个文档进行查询编译。

如有任何帮助,我们将不胜感激。

XQueryExecutableimmutable线程安全的,所以你可以安全地缓存它:例如,通过将(线程安全的)映射或散列 table 从查询字符串保存到 XQueryExecutable。唯一需要注意的是,您必须更改实例化 Processor 对象的方式:与其在每次 运行 查询时都创建一个新的 Processor,您应该为整个应用程序使用一个 Processor 对象,因为编译后的查询和源文档必须在同一个处理器的控制下构建。

XQueryCompiler 可串行重复使用,但由于 ErrorList 对象在编译过程中更新,因此不应在多个线程中同时使用。因此,您可能会发现每次编译查询时创建一个新的 XQueryCompiler 是最简单的。