gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:35:08 25 4
gpt4 key购买 nike

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

Care must be taken not to use this Transformer in multiple Threads running concurrently.

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

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

最佳答案

像 Transformer 这样的 JAXP 类是接口(interface),并且它们有多种实现(目前使用最广泛的两个是 Xalan 和 Saxon)。打破多线程规则的实际效果将取决于您使用的处理器;但在这两种情况下,它们都是相当不可预测的。 Transformer 可能保存变量和动态执行上下文的当前状态,因此您确实不希望两个转换重写彼此的变量。

为了避免每次使用时重新编译样式表的成本,您需要缓存 Templates 对象,而不是 Transformer 对象。理论上,您可以连续重用 Transformer 在单个线程中连续执行多个转换,但这没有意义:只需为每个新转换创建一个新的 Transformer(从缓存的模板)。

另一件事需要注意的是 DOM 不是线程安全的,即使在只读模式下也是如此。不允许两个转换同时访问同一棵 DOM 树。如果您确实需要在多个转换之间共享源文档,那么最好的方法最终取决于您使用的是 Xalan 还是 Saxon。

关于java - 请求澄清多线程环境中 TransformerFactory 的 XSLT Transformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58067811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com