Commit 88748ad2 authored by Gaston Dombiak's avatar Gaston Dombiak Committed by gaston

Use a pool of SAXReaders. JM-364


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@1759 b35dd754-fafc-0310-a699-88a17e54d16e
parent 308e019a
......@@ -11,19 +11,22 @@
package org.jivesoftware.messenger;
import org.jivesoftware.messenger.container.BasicModule;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.JiveGlobals;
import org.dom4j.Element;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.messenger.container.BasicModule;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.Log;
import java.sql.*;
import java.sql.Connection;
import java.io.StringWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Private storage for user accounts (JEP-0049). It is used by some XMPP systems
......@@ -47,7 +50,10 @@ public class PrivateStorage extends BasicModule {
private boolean enabled = JiveGlobals.getBooleanProperty("xmpp.privateStorageEnabled", true);
SAXReader xmlReader = new SAXReader();
/**
* Pool of SAX Readers. SAXReader is not thread safe so we need to have a pool of readers.
*/
private BlockingQueue<SAXReader> xmlReaders = new LinkedBlockingQueue<SAXReader>();
/**
* Constructs a new PrivateStore instance.
......@@ -143,7 +149,10 @@ public class PrivateStorage extends BasicModule {
if (enabled) {
Connection con = null;
PreparedStatement pstmt = null;
SAXReader xmlReader = null;
try {
// Get a sax reader from the pool
xmlReader = xmlReaders.take();
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_PRIVATE);
pstmt.setString(1, username);
......@@ -161,6 +170,8 @@ public class PrivateStorage extends BasicModule {
Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
}
finally {
// Return the sax reader to the pool
if (xmlReader != null) xmlReaders.add(xmlReader);
try { if (pstmt != null) { pstmt.close(); } }
catch (Exception e) { Log.error(e); }
try { if (con != null) { con.close(); } }
......@@ -169,4 +180,18 @@ public class PrivateStorage extends BasicModule {
}
return data;
}
public void start() throws IllegalStateException {
super.start();
// Initialize the pool of sax readers
for (int i=0; i<10; i++) {
xmlReaders.add(new SAXReader());
}
}
public void stop() {
super.stop();
// Clean up the pool of sax readers
xmlReaders.clear();
}
}
\ No newline at end of file
......@@ -14,15 +14,17 @@ package org.jivesoftware.messenger.vcard;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.AlreadyExistsException;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.NotFoundException;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.SQLException;
import java.io.StringReader;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Default implementation of the VCardProvider interface, which reads and writes data
......@@ -41,28 +43,46 @@ public class DefaultVCardProvider implements VCardProvider {
private static final String INSERT_PROPERTY =
"INSERT INTO jiveVCard (username, value) VALUES (?, ?)";
private SAXReader saxReader = new SAXReader();
/**
* Pool of SAX Readers. SAXReader is not thread safe so we need to have a pool of readers.
*/
private BlockingQueue<SAXReader> xmlReaders = new LinkedBlockingQueue<SAXReader>();
public DefaultVCardProvider() {
super();
// Initialize the pool of sax readers
for (int i=0; i<10; i++) {
xmlReaders.add(new SAXReader());
}
}
public Element loadVCard(String username) {
synchronized (username.intern()) {
Element vCardElement = null;
java.sql.Connection con = null;
PreparedStatement pstmt = null;
SAXReader xmlReader = null;
try {
// Get a sax reader from the pool
xmlReader = xmlReaders.take();
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_PROPERTIES);
pstmt.setString(1, username);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
vCardElement =
saxReader.read(new StringReader(rs.getString(1))).getRootElement();
xmlReader.read(new StringReader(rs.getString(1))).getRootElement();
}
}
catch (Exception e) {
Log.error(e);
}
finally {
// Return the sax reader to the pool
if (xmlReader != null) {
xmlReaders.add(xmlReader);
}
try { if (pstmt != null) { pstmt.close(); } }
catch (Exception e) { Log.error(e); }
try { if (con != null) { con.close(); } }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment