拥有用于 XSD 验证的线程安全缓存

Having a thread-safe cache for XSD Validation

我正在处理 XSD 验证的应用程序,我希望缓存我的模式。
另一方面,该应用程序使用多个线程,所以我想知道加载 XSD 文件的线程安全方法是什么。
目前,我为每个 XSD 创建了一个新的 net.sf.saxon。s9api.ProcessorSchemaManager 之后用于验证大量 xmls

Processor processor = new Processor(true);

SchemaManager sm = processor.getSchemaManager();
sm.load(new StreamSource(new File(xsdFilename)));

真的有必要吗?我可以实例化一个 Processor 并将其用于所有 XSD 吗?那么在这种情况下在多线程上下文中获取 SM 是否安全?

此外,将 SchemaManager 实例存储在表示应用程序缓存的 Map 中是否正确?或者应该使用 SchemaValidator 对象?

Saxon 处理器和 SchemaManager 可用于存储多个模式(或者更确切地说,一个模式是来自多个模式文档的所有模式组件的联合),并且它是线程安全的,所以它应该可以正常工作这么久因为所有模式都是兼容的。我的意思是你不能有两个具有相同名称的不同模式组件,例如作为加载不同 no-namespace 模式的结果,或者作为使用 xs:redefines.

的结果

但是,如果您想将架构分开,则每个架构都需要不同的 ProcessorSchemaManager

SchemaValidator 对象不是 thread-safe:您应该为每个验证任务创建一个新的 SchemaValidator。创建这个对象很便宜。

同样值得注意的是,在极端情况下,即使模式的几个部分不相交,针对“复合”模式进行验证也可能会改变验证结果:例如,当元素通配符具有 processContents="strict"processContents="lax".