2012-06-21 4 views
0

서블릿의 init() 메소드에서 초기화 된 Document 객체를 doPost() 메소드에서 사용하여 요청을 처리합니다.서블릿의 xpath 쿼리에서 예외가 발생합니다.

selectNodeList 서블릿이 동시에 많은 요청을 서비스 할 때 xpath query가 예외를 제공합니다. 예외는 다음과 같습니다 :

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) 

도움말 나를 밖으로 정렬 문제.

+0

이 문서는 어디에 선언되어 있습니까? 그것이 당신의 서블릿의 private 변수라면 동시성 문제가있는 것 같습니다. – Cygnusx1

+0

고마워 .. 그래, 어떻게이 문제를 해결합니까? – Arun

+0

문서에 대한 액세스를 동기화하십시오. 아니면 doPost() – Cygnusx1

답변

1

CachedXPathAPI 클래스는 스레드로부터 안전하지 않습니다. 서블릿에서 사용하는 경우 액세스를 동기화 (또는 여러 인스턴스 사용) 할 수 있도록주의를 기울여야합니다. Apache Xalan-j javadoc에서

: CachedXPathAPI의 특정 인스턴스가 동기화없이 여러 스레드에 따라 운영되어야 함을

참고; 우리는 현재 단일 DTM에 대한 다중 스레드 액세스를 지원하지 않습니다. 마찬가지로 CachedXPathAPI의 특정 인스턴스를 동기화하지 않고 여러 스레드에서 조작해서는 안됩니다.

+0

감사합니다.이 시나리오를 처리 할 수있는 다른 대안 방법이 있습니까? – Arun

+0

XML에서 데이터를 제공하는 것은 나쁜 생각이라고 생각합니다. init()에서 XML을 구조화 된 Java 객체로 변환 한 다음 각 요청에 대해 XML 처리를 추가하지 않고 해당 객체의 값을 제공해야합니다. – npe

0

시도하십시오. 색슨 문서 인스턴스와 캐시 된 쿼리/스타일 시트/xpath 표현식은 모두 스레드로부터 안전합니다.

관련 문제