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

问题描述

我正在开发用于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 Processor和SchemaManager可用于存储多个模式(或更确切地说,一个模式是多个模式文档中所有模式组件的并集),并且是线程安全的,因此只要所有模式是兼容的。我的意思是说,您不能有两个具有相同名称的不同架构组件,例如加载不同的无命名空间模式的结果,或者使用xs:redefines的结果。

但是,如果要将模式分开,则每个模式都需要一个不同的org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Misplaced or misused argument matcher detected here: Processor

SchemaManager对象不是线程安全的:您应该为每个验证任务创建一个新的SchemaValidator。创建该对象很便宜。

还值得注意的是,在某些极端情况下,即使“模式”的多个部分不相交,针对“复合”模式进行验证也可能会更改验证结果:例如,当元素通配符具有{​​{1}}或SchemaValidator

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...