snichol 2002/11/20 13:54:25 Modified: java/src/org/apache/soap/rpc Call.java java/src/org/apache/soap/server/http RPCRouterServlet.java java/src/org/apache/soap/util/xml XMLParserUtils.java Log: Submitted by: Pavel Ausianik <[EMAIL PROTECTED]> Please see what I propose to solve problem with many allocated DocumentBuilders. Other classes were DocumentBuilder is used can be easily adopted in the same way as Call is. See thread at http://marc.theaimsgroup.com/?l=soap-dev&m=103582304223623&w=2 for discussion of document builder pooling. Revision Changes Path 1.24 +10 -4 xml-soap/java/src/org/apache/soap/rpc/Call.java Index: Call.java =================================================================== RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/rpc/Call.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- Call.java 20 Nov 2002 21:34:42 -0000 1.23 +++ Call.java 20 Nov 2002 21:54:25 -0000 1.24 @@ -90,7 +90,6 @@ */ public class Call extends RPCMessage { - private DocumentBuilder xdb; private SOAPMappingRegistry smr = null; private SOAPTransport st = null;; private int to = 0; @@ -452,8 +451,15 @@ } // if the DOM parser hasn't been created yet, do it now - if (xdb == null) - xdb = XMLParserUtils.getXMLDocBuilder(); - return xdb.parse(input); + DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilderFromPool(); + Document doc = null; + // if the DOM parser hasn't been created yet, do it now + try { + doc = xdb.parse(input); + } + finally { + XMLParserUtils.returnDocumentBuilderToPool(xdb); + } + return doc; } } 1.44 +14 -10 xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet.java Index: RPCRouterServlet.java =================================================================== RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/http/RPCRouterServlet.java,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- RPCRouterServlet.java 20 Nov 2002 21:34:42 -0000 1.43 +++ RPCRouterServlet.java 20 Nov 2002 21:54:25 -0000 1.44 @@ -307,17 +307,21 @@ // EnvelopeEditor // Note: XMLParser that is specified by init-param isused in // this process. - DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder(); + DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilderFromPool(); - callEnv = - ServerHTTPUtils.readEnvelopeFromRequest(xdb, - req.getContentType(), - req.getContentLength(), - req.getInputStream(), - editor, - res, - reqCtx, - ServerHTTPUtils.getHeaders(req)); + try { + callEnv = + ServerHTTPUtils.readEnvelopeFromRequest(xdb, + req.getContentType(), + req.getContentLength(), + req.getInputStream(), + editor, + res, + reqCtx, + ServerHTTPUtils.getHeaders(req)); + } finally { + XMLParserUtils.returnDocumentBuilderToPool(xdb); + } if (callEnv == null) return; call = RPCRouter.extractCallFromEnvelope(serviceManager, callEnv, 1.8 +38 -12 xml-soap/java/src/org/apache/soap/util/xml/XMLParserUtils.java Index: XMLParserUtils.java =================================================================== RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XMLParserUtils.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- XMLParserUtils.java 30 Oct 2002 02:43:04 -0000 1.7 +++ XMLParserUtils.java 20 Nov 2002 21:54:25 -0000 1.8 @@ -57,7 +57,8 @@ package org.apache.soap.util.xml; -import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; @@ -73,7 +74,7 @@ */ public class XMLParserUtils { private static DocumentBuilderFactory dbf = null; - private static HashMap docBuilderTable = new HashMap (); + private static List allocatedBuildersList = new ArrayList(10); static { // Create a default instance. @@ -167,20 +168,45 @@ */ synchronized public static DocumentBuilder getXMLDocBuilder() throws IllegalArgumentException { - // if a document builder has already been created for this thread - // then just reuse that. otherwise create a new one and remember it. - Thread t = Thread.currentThread (); - DocumentBuilder db = (DocumentBuilder) docBuilderTable.get (t); - if (db != null) { - return db; - } else { try { - db = dbf.newDocumentBuilder(); - docBuilderTable.put (t, db); - return db; + return dbf.newDocumentBuilder(); } catch (ParserConfigurationException pce) { throw new IllegalArgumentException(pce.toString()); } } + + + /** + * Use this method to get a JAXP document builder. + * This method either returns a previosly allocated DocumentBuilder + * or creates a namespace aware, nonvalidating + * instance of the XML parser. + * + * @return DocumentBuilder an instance of a document builder, + * or null if a ParserConfigurationException was thrown. + */ + synchronized public static DocumentBuilder getXMLDocBuilderFromPool() { + // First check if we have DocBuider available + DocumentBuilder builder = null; + int size = allocatedBuildersList.size(); + if ( size > 0) { + builder = (DocumentBuilder)allocatedBuildersList.get(size-1); + allocatedBuildersList.remove(size-1); + } else + // Not available - create a new DocumentBuilder + builder = XMLParserUtils.getXMLDocBuilder(); + + return builder; + } + + /** + * Return a JAXP document builder, previosly allocated by method + * getXMLDocBuilderFromPool() for further reuse + * + * @param builder a DocumentBuilder to release + */ + synchronized public static void returnDocumentBuilderToPool(DocumentBuilder builder) { + if (builder != null) + allocatedBuildersList.add(builder); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>