为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2023-08-23 14:57:56
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,而不是在每个请求上重新创建它?
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

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

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

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


查看完整回答
反对 回复 2023-08-23
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

要编译和缓存固定代码,请使用newTemplates创建Templates对象,https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source -,然后为多线程环境中的每次执行使用newTransformerTemplates对象创建一个新的Transformer.

查看完整回答
反对 回复 2023-08-23
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信