亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請求澄清多線程環境中 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 關注
  • 244 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號