axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sebastien Bocq (JIRA)" <axis-...@ws.apache.org>
Subject [jira] Created: (AXIS-1700) axis performance in multithreading env
Date Tue, 07 Dec 2004 09:33:18 GMT
axis performance in multithreading env
--------------------------------------

         Key: AXIS-1700
         URL: http://nagoya.apache.org/jira/browse/AXIS-1700
     Project: Axis
        Type: Bug
  Components: Serialization/Deserialization  
    Versions: 1.2RC2    
 Environment: W2K
    Reporter: Sebastien Bocq


Hi,

While doing performance tests on deserialization, I noticed that Axis 
scales very poorly when increasing the number of threads.

Here are the figures:
5 threads, 1000 messages: 15 seconds
10 threads, 1000 messages: 56 seconds
15 threads, 1000 messages: 93 seconds

The root of the problem is in XMLUtils. Each time a node is created via 
the static fuction newDocument(...), there are two functions, 
getDocumentBuilder() and realeaseDocumentBuilder(), called which both 
peform synchronisation over a pool of document builders 
(documentBuilders ). Since XML documents contain many nodes and there 
are at least two synchronization points in the code per node created, I 
let you imagine the overhead suffered when more threads come into play.

I was able to achieve a significant performance boost by replacing the 
pool of DocumentBuilders (documentBuilders) by a single document builder 
stored in a ThreadLocal variable. This was already suggested a while ago 
in this mailing list (see "Performance Issues with AXIS & Axis Response 
time appears linear with load").

The results of my benchmark with the changes brought to the code are 
shown below.

5 threads, 1000 messages:  13seconds
10 threads, 1000 messages:  25,5 seconds
15 threads, 1000 messages: 37 seconds

As you can see, deserialization time scales now linearly with the number 
of threads which is a lot better. I placed a patch below. Could 
you include sth equivalent in the next release of the Axis.

Thanks,
Sebastien

--- XMLUtilsOld.java	Tue Nov 16 19:04:44 2004
+++ XMLUtilsNew.java	Tue Dec  7 10:03:59 2004
@@ -80,8 +80,23 @@
     private static final String saxParserFactoryProperty =
         "javax.xml.parsers.SAXParserFactory";
 
-    private static DocumentBuilderFactory dbf = getDOMFactory();
-    private static Stack                  documentBuilders = new Stack(); 
+    // DocumentBuilderFactory is not thread-safe. Place DocumentBuilder 
+    // in thread local variable to remove synchronization overhead.
+    
+    // private static DocumentBuilderFactory dbf = getDOMFactory();
+    // private static Stack                  documentBuilders = new Stack(); 
+    private static class ThreadLocalDocumentBuilder extends ThreadLocal {
+    	protected Object initialValue() {
+    		try {
+				return getDOMFactory().newDocumentBuilder();
+			} catch (ParserConfigurationException e) {
+	            log.error(Messages.getMessage("parserConfigurationException00"), e);
+			}
+			return null;
+    	}
+    }
+    private static ThreadLocalDocumentBuilder documentBuilder = new ThreadLocalDocumentBuilder();
+    
     private static SAXParserFactory       saxFactory;
     private static Stack                  saxParsers = new Stack();
     private static DefaultHandler doNothingContentHandler = new DefaultHandler();
@@ -206,36 +221,6 @@
         }
         return( dbf );
     }
-
-    /**
-     * Gets a DocumentBuilder
-     * @return DocumentBuilder
-     * @throws ParserConfigurationException
-     */ 
-    public static DocumentBuilder getDocumentBuilder() throws ParserConfigurationException
{
-        synchronized (documentBuilders) {
-            if (!documentBuilders.empty()) {
-                return (DocumentBuilder) documentBuilders.pop();
-            }
-        }
-        DocumentBuilder db = null;
-        synchronized (dbf) {
-            db = dbf.newDocumentBuilder();
-        }
-        return db;
-    }
-
-    /**
-     * Releases a DocumentBuilder
-     * @param db
-     */ 
-    public static void releaseDocumentBuilder(DocumentBuilder db) {
-        synchronized (documentBuilders) {
-            db.setErrorHandler(null); // setting implementation default
-            db.setEntityResolver(null); // setting implementation default
-            documentBuilders.push(db);
-        }
-    }
     
     private static boolean tryReset= true;
 
@@ -302,16 +287,9 @@
      */
     public static Document newDocument()
             throws ParserConfigurationException {
-        DocumentBuilder db = null;
-        try {
-            db = getDocumentBuilder();
-            Document doc = db.newDocument();
-            return doc;
-        } finally {
-            if (db != null) {
-                releaseDocumentBuilder(db);
-            }
-        }
+        DocumentBuilder db = (DocumentBuilder) documentBuilder.get();
+        Document doc = db.newDocument();
+        return doc;
     }
 
     /**
@@ -324,18 +302,11 @@
     public static Document newDocument(InputSource inp)
         throws ParserConfigurationException, SAXException, IOException
     {
-        DocumentBuilder db = null;
-        try {
-            db = getDocumentBuilder();
-            db.setEntityResolver(new DefaultEntityResolver());
-            db.setErrorHandler(new ParserErrorHandler());
-            Document doc = db.parse(inp);
-            return doc;
-        } finally {
-            if (db != null) {
-                releaseDocumentBuilder(db);
-            }
-        }
+        DocumentBuilder db = (DocumentBuilder) documentBuilder.get();
+        db.setEntityResolver(new DefaultEntityResolver());
+        db.setErrorHandler(new ParserErrorHandler());
+        Document doc = db.parse(inp);
+        return doc;
     }
 
     /**


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://nagoya.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


Mime
View raw message