Arun
Arun

Reputation: 13

xpath query in a servlet gives exception

I have a Document object initialized in the init() method of the servlet and use it in the doPost() method to service the requests.

selectNodeList() xpath query gives exception when the servlet services many request at same time. The Exception is shown below:

Caused by: javax.xml.transform.TransformerException: -1
    at org.apache.xpath.XPath.execute(XPath.java:331)
    at org.apache.xpath.CachedXPathAPI.eval(CachedXPathAPI.java:328)
    at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:255)
    at org.apache.xpath.CachedXPathAPI.selectNodeList(CachedXPathAPI.java:235)
    at com.pro.bb.servlets.Controller.getDataOrPeriodForReport(Controller.java:511)
    ... 23 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
    at org.apache.xpath.XPathContext.pushCurrentNode(XPathContext.java:808)
    at org.apache.xpath.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:447)
    at org.apache.xpath.axes.AxesWalker.nextNode(AxesWalker.java:409)
    at org.apache.xpath.axes.WalkingIterator.nextNode(WalkingIterator.java:176)
    at org.apache.xpath.axes.NodeSequence.nextNode(NodeSequence.java:320)
    at org.apache.xpath.axes.NodeSequence.runTo(NodeSequence.java:474)
    at org.apache.xpath.axes.NodeSequence.setRoot(NodeSequence.java:257)
    at org.apache.xpath.axes.LocPathIterator.execute(LocPathIterator.java:257)
    at org.apache.xpath.XPath.execute(XPath.java:308)

Help me sort out the issue.

Upvotes: 0

Views: 429

Answers (2)

Michael Kay
Michael Kay

Reputation: 163418

Try Saxon. Saxon document instances and cached queries/stylesheets/xpath expressions are all fully thread-safe.

Upvotes: 0

npe
npe

Reputation: 15709

The CachedXPathAPI class is not thread-safe. If you're using it in the servlet, you have to manualy take care for synchonizing access (or use multiple instances).

From the Apache Xalan-j javadoc:

Note that any particular instance of CachedXPathAPI must not be operated upon by multiple threads without synchronization; we do not currently support multithreaded access to a single DTM. Similarly, any particular instance of CachedXPathAPI must not be operated upon by multiple threads without synchronization.

Upvotes: 1

Related Questions