如何使用JDOM(线程安全)重用XPath实例?

时间:2011-10-13 07:08:08

标签: caching xpath thread-safety jdom

这里有一个示例代码:

x = XPath.newInstance("//collection/dvd[@id='B']");
Element e = (Element)x.selectSingleNode(doc);
listElement(e, "");

我的问题是,如果经常调用代码,我怎样才能使它快速。文档没有说明任何内容(XPath API doc)。

  • 我的xpath评估器是否在窗帘后面缓存? (我不这么认为)
  • 使用JDOM,xpath评估程序是否安全? - >可以缓存在静态地图中
  • 如果不是线程安全的,也许它们可以缓存在threadlocal的地图中
  • 它们是昂贵的物品吗?生产它们需要很长时间吗?他们消耗了很多记忆吗?
  • 可以更改xpath评估程序。您推荐哪种实施方案?它们与上述问题的观点不同吗?

如果您有使用JDOM和XPath的经验,请告诉我答案。

2 个答案:

答案 0 :(得分:2)

仅为了记录,将JDOM链接到其默认实现Jaxen的适配器线程安全。通过对org.jdom.xpath代码的快速研究可以很容易地得出结论。

关于线程安全的更普遍的问题:如果API的文档没有明确声称是线程安全的,那么假设必须始终不是(并且几乎总是如此)。而且,对线程安全声明提出质疑始终是谨慎的。

答案 1 :(得分:1)

找到回答这些问题的文档可能很困难:例如,很多人都惊讶地发现DOM不是线程安全的。我相信JDOM是,但我不知道它的XPath引擎。如果您使用Saxon作为XPath引擎(它适用于JDOM),则s9api接口的设计明确允许在一个线程中创建编译表达式并在多个线程中同时使用。