线程安全 XML 验证 Java 5

Thread Safe XML Validation in Java 5

所以我四处寻找线程安全的 Java XML Validator 和 none 似乎存在:

SchemFactory - 记录为非线程安全

Validator - 记录为非线程安全

Schema - documented as thread safe, but actually isn't

javax 实施之外还有什么?请注意,我在 Java 5 下,不能使用任何 Guava 库或任何超出 apache-commons 的东西,我已经探索和发现 the Validator framework,但我不确定这是否是实际上是线程安全的,如下所示:

Currently Validator instances may be safely reused if the current ValidatorResources are the same, as long as you have completed any previous validation, and you do not try to utilize a particular Validator instance from more than one thread at a time.

我认为这意味着只要我的每个线程都有一个实例,那么我们就可以正常工作。

但是我还有其他选择吗?我错过了一些明显的选择?

使用内置实例的多个实例。非线程安全只是意味着您不能同时在多个线程之间共享实例(SimpleDateFormatRandom 是很好的例子)。

您还可以使用 ThreadLocal 为每个线程提供它们自己的实例(而不是潜在地创建您自己的 "solution")。

Schema 是线程安全的很重要,因此您可以一次编译一个 schema 并在多个线程中重复使用它。您暗示 Xerces 模式声称是线程安全的,但实际上不是:那将是一个问题。

Validator 是否是线程安全的并不重要,因为每次验证实例文档时都应该创建一个新的 Validator。

要记住的另一件事是 JAXP 与 DOM 紧密相关,并且 DOM 不是线程安全的。这可能是个大问题。

至于你的问题,是否有替代方案,答案是肯定的:Saxon-EE 提供了替代方案 XSD 验证引擎,在编译模式和实例文档上都具有完全线程安全性。