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 对象以避免对我们处理的每个文档进行查询编译。
如有任何帮助,我们将不胜感激。
XQueryExecutable
是immutable和线程安全的,所以你可以安全地缓存它:例如,通过将(线程安全的)映射或散列 table 从查询字符串保存到 XQueryExecutable
。唯一需要注意的是,您必须更改实例化 Processor 对象的方式:与其在每次 运行 查询时都创建一个新的 Processor,您应该为整个应用程序使用一个 Processor 对象,因为编译后的查询和源文档必须在同一个处理器的控制下构建。
XQueryCompiler
可串行重复使用,但由于 ErrorList
对象在编译过程中更新,因此不应在多个线程中同时使用。因此,您可能会发现每次编译查询时创建一个新的 XQueryCompiler
是最简单的。
使用以下代码 运行 使用 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 对象以避免对我们处理的每个文档进行查询编译。
如有任何帮助,我们将不胜感激。
XQueryExecutable
是immutable和线程安全的,所以你可以安全地缓存它:例如,通过将(线程安全的)映射或散列 table 从查询字符串保存到 XQueryExecutable
。唯一需要注意的是,您必须更改实例化 Processor 对象的方式:与其在每次 运行 查询时都创建一个新的 Processor,您应该为整个应用程序使用一个 Processor 对象,因为编译后的查询和源文档必须在同一个处理器的控制下构建。
XQueryCompiler
可串行重复使用,但由于 ErrorList
对象在编译过程中更新,因此不应在多个线程中同时使用。因此,您可能会发现每次编译查询时创建一个新的 XQueryCompiler
是最简单的。