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]>

Reply via email to