请求澄清多线程环境中 TransformerFactory 的 XSLT Transformer

Transformer文档(https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer-javax.xml.transform.Source-)说

必须注意不要在同时运行的多个线程中使用此 Transformer。

  • 当我在多线程环境中使用同一个 Transformer 对象时,会发生什么?

  • 为什么我们不能在 2 个线程中使用同一个 Transformer 对象?

如果我的 XSLT 源是固定的,我是否可以缓存 Transformer 对象,以便我的所有请求都将使用相同的 Transformer,而不是在每个请求上重新创建它?


SMILET
浏览 182回答 2
2回答

回首忆惘然

像 Transformer 这样的 JAXP 类是接口,并且它们有多种实现(目前使用最广泛的两个是 Xalan 和 Saxon)。打破多线程规则的实际效果将取决于您使用的处理器;但在这两种情况下,它们都是相当不可预测的。Transformer 可能保存变量和动态执行上下文的当前状态,因此您确实不希望两个转换重写彼此的变量。为了避免每次使用时重新编译样式表的成本,您需要缓存 Templates 对象,而不是 Transformer 对象。理论上,您可以连续重用 Transformer 在单个线程中连续执行多个转换,但这没有意义:只需为每个新转换创建一个新的 Transformer(从缓存的模板)。另一件需要注意的事情是 DOM 不是线程安全的,即使在只读模式下也是如此。不允许两个转换同时访问同一棵 DOM 树。如果您确实需要在多个转换之间共享源文档,那么最好的方法最终取决于您使用的是 Xalan 还是 Saxon。

牧羊人nacy

要编译和缓存固定代码,请使用newTemplates创建Templates对象,https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source -,然后为多线程环境中的每次执行使用newTransformer该Templates对象创建一个新的Transformer.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java