拥有用于 XSD 验证的线程安全缓存
Having a thread-safe cache for XSD Validation
我正在处理 XSD 验证的应用程序,我希望缓存我的模式。
另一方面,该应用程序使用多个线程,所以我想知道加载 XSD 文件的线程安全方法是什么。
目前,我为每个 XSD 创建了一个新的 net.sf.saxon。s9api.Processor。 SchemaManager 之后用于验证大量 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.
的结果
但是,如果您想将架构分开,则每个架构都需要不同的 Processor
和 SchemaManager
。
SchemaValidator
对象不是 thread-safe:您应该为每个验证任务创建一个新的 SchemaValidator
。创建这个对象很便宜。
同样值得注意的是,在极端情况下,即使模式的几个部分不相交,针对“复合”模式进行验证也可能会改变验证结果:例如,当元素通配符具有 processContents="strict"
或 processContents="lax"
.
我正在处理 XSD 验证的应用程序,我希望缓存我的模式。
另一方面,该应用程序使用多个线程,所以我想知道加载 XSD 文件的线程安全方法是什么。
目前,我为每个 XSD 创建了一个新的 net.sf.saxon。s9api.Processor。 SchemaManager 之后用于验证大量 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.
的结果但是,如果您想将架构分开,则每个架构都需要不同的 Processor
和 SchemaManager
。
SchemaValidator
对象不是 thread-safe:您应该为每个验证任务创建一个新的 SchemaValidator
。创建这个对象很便宜。
同样值得注意的是,在极端情况下,即使模式的几个部分不相交,针对“复合”模式进行验证也可能会改变验证结果:例如,当元素通配符具有 processContents="strict"
或 processContents="lax"
.