remm 2004/01/09 03:35:08 Modified: catalina/src/share/org/apache/catalina/session JDBCStore.java LocalStrings.properties Log: - Allow configuring users and passwords. - Automatically reconnect if connection fails for some reason. - Please review :) - Bug 25889. - Submitted by Peter Rossbach. - I think we would need to add a DataSource based persistent store (this way, it would have mush better scalability, and would not need to care about the reconnect logic). Revision Changes Path 1.7 +457 -331 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/JDBCStore.java Index: JDBCStore.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/JDBCStore.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- JDBCStore.java 2 Sep 2003 21:22:01 -0000 1.6 +++ JDBCStore.java 9 Jan 2004 11:35:08 -0000 1.7 @@ -64,6 +64,12 @@ package org.apache.catalina.session; +import org.apache.catalina.Container; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.Loader; +import org.apache.catalina.Session; +import org.apache.catalina.Store; +import org.apache.catalina.util.CustomObjectInputStream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; @@ -73,18 +79,12 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.sql.Connection; -import java.sql.DriverManager; +import java.sql.Driver; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; - -import org.apache.catalina.Container; -import org.apache.catalina.LifecycleException; -import org.apache.catalina.Loader; -import org.apache.catalina.Session; -import org.apache.catalina.Store; -import org.apache.catalina.util.CustomObjectInputStream; +import java.util.Properties; /** * Implementation of the <code>Store</code> interface that stores @@ -96,7 +96,7 @@ */ public class JDBCStore - extends StoreBase implements Store { + extends StoreBase implements Store { /** * The descriptive information about this implementation. @@ -119,14 +119,30 @@ protected String threadName = "JDBCStore"; /** + * The connection username to use when trying to connect to the database. + */ + protected String connectionName = null; + + + /** + * The connection URL to use when trying to connect to the database. + */ + protected String connectionPassword = null; + + /** * Connection string to use when connecting to the DB. */ - protected String connString = null; + protected String connectionURL = null; /** * The database connection. */ - private Connection conn = null; + private Connection dbConnection = null; + + /** + * Instance of the JDBC Driver class we use as a connection factory. + */ + protected Driver driver = null; /** * Driver to use. @@ -208,7 +224,7 @@ * Return the info for this Store. */ public String getInfo() { - return(info); + return (info); } /** @@ -237,14 +253,14 @@ * Return the thread name for this Store. */ public String getThreadName() { - return(threadName); + return (threadName); } /** * Return the name for this Store, used for logging. */ public String getStoreName() { - return(storeName); + return (storeName); } /** @@ -256,8 +272,8 @@ String oldDriverName = this.driverName; this.driverName = driverName; support.firePropertyChange("driverName", - oldDriverName, - this.driverName); + oldDriverName, + this.driverName); this.driverName = driverName; } @@ -265,7 +281,41 @@ * Return the driver for this Store. */ public String getDriverName() { - return(this.driverName); + return (this.driverName); + } + + /** + * Return the username to use to connect to the database. + * + */ + public String getConnectionName() { + return connectionName; + } + + /** + * Set the username to use to connect to the database. + * + * @param connectionName Username + */ + public void setConnectionName(String connectionName) { + this.connectionName = connectionName; + } + + /** + * Return the password to use to connect to the database. + * + */ + public String getConnectionPassword() { + return connectionPassword; + } + + /** + * Set the password to use to connect to the database. + * + * @param connectionPassword User password + */ + public void setConnectionPassword(String connectionPassword) { + this.connectionPassword = connectionPassword; } /** @@ -274,18 +324,18 @@ * @param connectionURL The new Connection URL */ public void setConnectionURL(String connectionURL) { - String oldConnString = this.connString; - this.connString = connectionURL; - support.firePropertyChange("connString", - oldConnString, - this.connString); + String oldConnString = this.connectionURL; + this.connectionURL = connectionURL; + support.firePropertyChange("connectionURL", + oldConnString, + this.connectionURL); } /** * Return the Connection URL for this Store. */ public String getConnectionURL() { - return(this.connString); + return (this.connectionURL); } /** @@ -297,15 +347,15 @@ String oldSessionTable = this.sessionTable; this.sessionTable = sessionTable; support.firePropertyChange("sessionTable", - oldSessionTable, - this.sessionTable); + oldSessionTable, + this.sessionTable); } /** * Return the table for this Store. */ public String getSessionTable() { - return(this.sessionTable); + return (this.sessionTable); } /** @@ -317,15 +367,15 @@ String oldSessionAppCol = this.sessionAppCol; this.sessionAppCol = sessionAppCol; support.firePropertyChange("sessionAppCol", - oldSessionAppCol, - this.sessionAppCol); + oldSessionAppCol, + this.sessionAppCol); } /** * Return the web application name column for the table. */ public String getSessionAppCol() { - return(this.sessionAppCol); + return (this.sessionAppCol); } /** @@ -337,15 +387,15 @@ String oldSessionIdCol = this.sessionIdCol; this.sessionIdCol = sessionIdCol; support.firePropertyChange("sessionIdCol", - oldSessionIdCol, - this.sessionIdCol); + oldSessionIdCol, + this.sessionIdCol); } /** * Return the Id column for the table. */ public String getSessionIdCol() { - return(this.sessionIdCol); + return (this.sessionIdCol); } /** @@ -357,15 +407,15 @@ String oldSessionDataCol = this.sessionDataCol; this.sessionDataCol = sessionDataCol; support.firePropertyChange("sessionDataCol", - oldSessionDataCol, - this.sessionDataCol); + oldSessionDataCol, + this.sessionDataCol); } /** * Return the data column for the table */ public String getSessionDataCol() { - return(this.sessionDataCol); + return (this.sessionDataCol); } /** @@ -377,15 +427,15 @@ String oldSessionValidCol = this.sessionValidCol; this.sessionValidCol = sessionValidCol; support.firePropertyChange("sessionValidCol", - oldSessionValidCol, - this.sessionValidCol); + oldSessionValidCol, + this.sessionValidCol); } /** * Return the Is Valid column */ public String getSessionValidCol() { - return(this.sessionValidCol); + return (this.sessionValidCol); } /** @@ -397,15 +447,15 @@ String oldSessionMaxInactiveCol = this.sessionMaxInactiveCol; this.sessionMaxInactiveCol = sessionMaxInactiveCol; support.firePropertyChange("sessionMaxInactiveCol", - oldSessionMaxInactiveCol, - this.sessionMaxInactiveCol); + oldSessionMaxInactiveCol, + this.sessionMaxInactiveCol); } /** * Return the Max Inactive column */ public String getSessionMaxInactiveCol() { - return(this.sessionMaxInactiveCol); + return (this.sessionMaxInactiveCol); } /** @@ -417,15 +467,15 @@ String oldSessionLastAccessedCol = this.sessionLastAccessedCol; this.sessionLastAccessedCol = sessionLastAccessedCol; support.firePropertyChange("sessionLastAccessedCol", - oldSessionLastAccessedCol, - this.sessionLastAccessedCol); + oldSessionLastAccessedCol, + this.sessionLastAccessedCol); } /** * Return the Last Accessed column */ public String getSessionLastAccessedCol() { - return(this.sessionLastAccessedCol); + return (this.sessionLastAccessedCol); } // --------------------------------------------------------- Public Methods @@ -439,49 +489,53 @@ */ public String[] keys() throws IOException { String keysSql = - "SELECT " + sessionIdCol + " FROM " + sessionTable + - " WHERE " + sessionAppCol + " = ?"; + "SELECT " + sessionIdCol + " FROM " + sessionTable + + " WHERE " + sessionAppCol + " = ?"; ResultSet rst = null; String keys[] = null; - int i; - - synchronized(this) { - Connection _conn = getConnection(); - - if(_conn == null) { - return(new String[0]); - } - - try { - if(preparedKeysSql == null) { - preparedKeysSql = _conn.prepareStatement(keysSql); + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + + Connection _conn = getConnection(); + if (_conn == null) { + return (new String[0]); } - - preparedKeysSql.setString(1, getName()); - rst = preparedKeysSql.executeQuery(); - ArrayList tmpkeys = new ArrayList(); - if (rst != null) { - while(rst.next()) { - tmpkeys.add(rst.getString(1)); - } - } - keys = (String[]) tmpkeys.toArray(new String[tmpkeys.size()]); - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } finally { try { - if(rst != null) { - rst.close(); + if (preparedKeysSql == null) { + preparedKeysSql = _conn.prepareStatement(keysSql); + } + + preparedKeysSql.setString(1, getName()); + rst = preparedKeysSql.executeQuery(); + ArrayList tmpkeys = new ArrayList(); + if (rst != null) { + while (rst.next()) { + tmpkeys.add(rst.getString(1)); + } + } + keys = (String[]) tmpkeys.toArray(new String[tmpkeys.size()]); + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + // Close the connection so that it gets reopened next time + if (dbConnection != null) + close(dbConnection); + } finally { + try { + if (rst != null) { + rst.close(); + } + } catch (SQLException e) { + ; } - } catch(SQLException e) { - ; - } - release(_conn); + release(_conn); + } + numberOfTries--; } } - return(keys); + return (keys); } /** @@ -493,42 +547,48 @@ */ public int getSize() throws IOException { int size = 0; - String sizeSql = - "SELECT COUNT(" + sessionIdCol + ") FROM " + sessionTable + - " WHERE " + sessionAppCol + " = ?"; + String sizeSql = + "SELECT COUNT(" + sessionIdCol + ") FROM " + sessionTable + + " WHERE " + sessionAppCol + " = ?"; ResultSet rst = null; - synchronized(this) { - Connection _conn = getConnection(); - - if(_conn == null) { - return(size); - } + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + Connection _conn = getConnection(); - try { - if(preparedSizeSql == null) { - preparedSizeSql = _conn.prepareStatement(sizeSql); + if (_conn == null) { + return (size); } - preparedSizeSql.setString(1, getName()); - rst = preparedSizeSql.executeQuery(); - if (rst.next()) { - size = rst.getInt(1); - } - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } finally { try { - if(rst != null) - rst.close(); - } catch(SQLException e) { - ; - } + if (preparedSizeSql == null) { + preparedSizeSql = _conn.prepareStatement(sizeSql); + } + + preparedSizeSql.setString(1, getName()); + rst = preparedSizeSql.executeQuery(); + if (rst.next()) { + size = rst.getInt(1); + } + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + if (dbConnection != null) + close(dbConnection); + } finally { + try { + if (rst != null) + rst.close(); + } catch (SQLException e) { + ; + } - release(_conn); + release(_conn); + } + numberOfTries--; } } - return(size); + return (size); } /** @@ -541,7 +601,7 @@ * @exception IOException if an input/output error occurred */ public Session load(String id) - throws ClassNotFoundException, IOException { + throws ClassNotFoundException, IOException { ResultSet rst = null; StandardSession _session = null; Loader loader = null; @@ -550,74 +610,80 @@ BufferedInputStream bis = null; Container container = manager.getContainer(); String loadSql = - "SELECT " + sessionIdCol + ", " + sessionDataCol + " FROM " + - sessionTable + " WHERE " + sessionIdCol + " = ? AND " + - sessionAppCol + " = ?"; - - synchronized(this) { - Connection _conn = getConnection(); - if(_conn == null) { - return(null); - } - - try { - if(preparedLoadSql == null) { - preparedLoadSql = _conn.prepareStatement(loadSql); + "SELECT " + sessionIdCol + ", " + sessionDataCol + " FROM " + + sessionTable + " WHERE " + sessionIdCol + " = ? AND " + + sessionAppCol + " = ?"; + + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + Connection _conn = getConnection(); + if (_conn == null) { + return (null); } - preparedLoadSql.setString(1, id); - preparedLoadSql.setString(2, getName()); - rst = preparedLoadSql.executeQuery(); - if (rst.next()) { - bis = new BufferedInputStream(rst.getBinaryStream(2)); - - if (container != null) { - loader = container.getLoader(); - } - if (loader != null) { - classLoader = loader.getClassLoader(); - } - if (classLoader != null) { - ois = new CustomObjectInputStream(bis, - classLoader); - } else { - ois = new ObjectInputStream(bis); - } - - if (debug > 0) { - log(sm.getString(getStoreName()+".loading", - id, sessionTable)); + try { + if (preparedLoadSql == null) { + preparedLoadSql = _conn.prepareStatement(loadSql); } - _session = (StandardSession) manager.createEmptySession(); - _session.readObjectData(ois); - _session.setManager(manager); + preparedLoadSql.setString(1, id); + preparedLoadSql.setString(2, getName()); + rst = preparedLoadSql.executeQuery(); + if (rst.next()) { + bis = new BufferedInputStream(rst.getBinaryStream(2)); + + if (container != null) { + loader = container.getLoader(); + } + if (loader != null) { + classLoader = loader.getClassLoader(); + } + if (classLoader != null) { + ois = new CustomObjectInputStream(bis, + classLoader); + } else { + ois = new ObjectInputStream(bis); + } + + if (debug > 0) { + log(sm.getString(getStoreName() + ".loading", + id, sessionTable)); + } + + _session = (StandardSession) manager.createEmptySession(); + _session.readObjectData(ois); + _session.setManager(manager); - } else if (debug > 0) { - log(getStoreName()+": No persisted data object found"); - } - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } finally { - try { - if(rst != null) { - rst.close(); + } else if (debug > 0) { + log(getStoreName() + ": No persisted data object found"); } - } catch(SQLException e) { - ; - } - if (ois != null) { + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + if (dbConnection != null) + close(dbConnection); + } finally { try { - ois.close(); - } catch (IOException e) { + if (rst != null) { + rst.close(); + } + } catch (SQLException e) { ; } + if (ois != null) { + try { + ois.close(); + } catch (IOException e) { + ; + } + } + release(_conn); } - release(_conn); + numberOfTries--; } } - return(_session); + return (_session); } /** @@ -631,33 +697,39 @@ */ public void remove(String id) throws IOException { String removeSql = - "DELETE FROM " + sessionTable + " WHERE " + sessionIdCol + - " = ? AND " + sessionAppCol + " = ?"; - - synchronized(this) { - Connection _conn = getConnection(); + "DELETE FROM " + sessionTable + " WHERE " + sessionIdCol + + " = ? AND " + sessionAppCol + " = ?"; - if(_conn == null) { - return; - } + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + Connection _conn = getConnection(); - try { - if(preparedRemoveSql == null) { - preparedRemoveSql = _conn.prepareStatement(removeSql); + if (_conn == null) { + return; } - preparedRemoveSql.setString(1, id); - preparedRemoveSql.setString(2, getName()); - preparedRemoveSql.execute(); - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } finally { - release(_conn); + try { + if (preparedRemoveSql == null) { + preparedRemoveSql = _conn.prepareStatement(removeSql); + } + + preparedRemoveSql.setString(1, id); + preparedRemoveSql.setString(2, getName()); + preparedRemoveSql.execute(); + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + if (dbConnection != null) + close(dbConnection); + } finally { + release(_conn); + } + numberOfTries--; } } if (debug > 0) { - log(sm.getString(getStoreName()+".removing", id, sessionTable)); + log(sm.getString(getStoreName() + ".removing", id, sessionTable)); } } @@ -668,25 +740,31 @@ */ public void clear() throws IOException { String clearSql = - "DELETE FROM " + sessionTable + " WHERE " + sessionAppCol + " = ?"; + "DELETE FROM " + sessionTable + " WHERE " + sessionAppCol + " = ?"; - synchronized(this) { - Connection _conn = getConnection(); - if(_conn == null) { - return; - } - - try { - if(preparedClearSql == null) { - preparedClearSql = _conn.prepareStatement(clearSql); + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + Connection _conn = getConnection(); + if (_conn == null) { + return; } - preparedClearSql.setString(1, getName()); - preparedClearSql.execute(); - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } finally { - release(_conn); + try { + if (preparedClearSql == null) { + preparedClearSql = _conn.prepareStatement(clearSql); + } + + preparedClearSql.setString(1, getName()); + preparedClearSql.execute(); + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + if (dbConnection != null) + close(dbConnection); + } finally { + release(_conn); + } + numberOfTries--; } } } @@ -699,70 +777,79 @@ */ public void save(Session session) throws IOException { String saveSql = - "INSERT INTO " + sessionTable + " (" + sessionIdCol + ", " + - sessionAppCol + ", " + - sessionDataCol + ", " + - sessionValidCol + ", " + - sessionMaxInactiveCol + ", " + - sessionLastAccessedCol + ") VALUES (?, ?, ?, ?, ?, ?)"; + "INSERT INTO " + sessionTable + " (" + sessionIdCol + ", " + + sessionAppCol + ", " + + sessionDataCol + ", " + + sessionValidCol + ", " + + sessionMaxInactiveCol + ", " + + sessionLastAccessedCol + ") VALUES (?, ?, ?, ?, ?, ?)"; ObjectOutputStream oos = null; ByteArrayOutputStream bos = null; ByteArrayInputStream bis = null; InputStream in = null; - synchronized(this) { - Connection _conn = getConnection(); - if(_conn == null) { - return; - } + synchronized (this) { + int numberOfTries = 2; + while (numberOfTries > 0) { + Connection _conn = getConnection(); + if (_conn == null) { + return; + } - // If sessions already exist in DB, remove and insert again. - // TODO: - // * Check if ID exists in database and if so use UPDATE. - remove(session.getId()); + // If sessions already exist in DB, remove and insert again. + // TODO: + // * Check if ID exists in database and if so use UPDATE. + remove(session.getId()); - try { - bos = new ByteArrayOutputStream(); - oos = new ObjectOutputStream(new BufferedOutputStream(bos)); + try { + bos = new ByteArrayOutputStream(); + oos = new ObjectOutputStream(new BufferedOutputStream(bos)); - ((StandardSession)session).writeObjectData(oos); - oos.close(); + ((StandardSession) session).writeObjectData(oos); + oos.close(); + oos = null; + byte[] obs = bos.toByteArray(); + int size = obs.length; + bis = new ByteArrayInputStream(obs, 0, size); + in = new BufferedInputStream(bis, size); - byte[] obs = bos.toByteArray(); - int size = obs.length; - bis = new ByteArrayInputStream(obs, 0, size); - in = new BufferedInputStream(bis, size); - - if(preparedSaveSql == null) { - preparedSaveSql = _conn.prepareStatement(saveSql); - } - - preparedSaveSql.setString(1, session.getId()); - preparedSaveSql.setString(2, getName()); - preparedSaveSql.setBinaryStream(3, in, size); - preparedSaveSql.setString(4, session.isValid()?"1":"0"); - preparedSaveSql.setInt(5, session.getMaxInactiveInterval()); - preparedSaveSql.setLong(6, session.getLastAccessedTime()); - preparedSaveSql.execute(); - } catch(SQLException e) { - log(sm.getString(getStoreName()+".SQLException", e)); - } catch (IOException e) { - ; - } finally { - if(bis != null) { - bis.close(); - } - if(in != null) { - in.close(); - } + if (preparedSaveSql == null) { + preparedSaveSql = _conn.prepareStatement(saveSql); + } - release(_conn); + preparedSaveSql.setString(1, session.getId()); + preparedSaveSql.setString(2, getName()); + preparedSaveSql.setBinaryStream(3, in, size); + preparedSaveSql.setString(4, session.isValid() ? "1" : "0"); + preparedSaveSql.setInt(5, session.getMaxInactiveInterval()); + preparedSaveSql.setLong(6, session.getLastAccessedTime()); + preparedSaveSql.execute(); + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".SQLException", e)); + if (dbConnection != null) + close(dbConnection); + } catch (IOException e) { + ; + } finally { + if (oos != null) { + oos.close(); + } + if (bis != null) { + bis.close(); + } + if (in != null) { + in.close(); + } + + release(_conn); + } + numberOfTries--; } } if (debug > 0) { - log(sm.getString(getStoreName()+".saving", - session.getId(), sessionTable)); + log(sm.getString(getStoreName() + ".saving", + session.getId(), sessionTable)); } } @@ -775,27 +862,127 @@ * * @return <code>Connection</code> if the connection suceeded */ - protected Connection getConnection(){ + protected Connection getConnection() { try { - if(conn == null || conn.isClosed()) { - Class.forName(driverName); - log(sm.getString(getStoreName()+".checkConnectionDBClosed")); - conn = DriverManager.getConnection(connString); - conn.setAutoCommit(true); - - if(conn == null || conn.isClosed()) { - log(sm.getString(getStoreName()+".checkConnectionDBReOpenFail")); + if (dbConnection == null || dbConnection.isClosed()) { + log(sm.getString(getStoreName() + ".checkConnectionDBClosed")); + open(); + if (dbConnection == null || dbConnection.isClosed()) { + log(sm.getString(getStoreName() + ".checkConnectionDBReOpenFail")); } } - } catch (SQLException ex){ - log(sm.getString(getStoreName()+".checkConnectionSQLException", - ex.toString())); - } catch (ClassNotFoundException ex) { - log(sm.getString(getStoreName()+".checkConnectionClassNotFoundException", - ex.toString())); + } catch (SQLException ex) { + log(sm.getString(getStoreName() + ".checkConnectionSQLException", + ex.toString())); + } + + return dbConnection; + } + + /** + * Open (if necessary) and return a database connection for use by + * this Realm. + * + * @exception SQLException if a database error occurs + */ + protected Connection open() throws SQLException { + + // Do nothing if there is a database connection already open + if (dbConnection != null) + return (dbConnection); + + // Instantiate our database driver if necessary + if (driver == null) { + try { + Class clazz = Class.forName(driverName); + driver = (Driver) clazz.newInstance(); + } catch (ClassNotFoundException ex) { + log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException", + ex.toString())); + } catch (InstantiationException ex) { + log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException", + ex.toString())); + } catch (IllegalAccessException ex) { + log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException", + ex.toString())); + } + } + + // Open a new connection + Properties props = new Properties(); + if (connectionName != null) + props.put("user", connectionName); + if (connectionPassword != null) + props.put("password", connectionPassword); + dbConnection = driver.connect(connectionURL, props); + dbConnection.setAutoCommit(true); + return (dbConnection); + + } + + /** + * Close the specified database connection. + * + * @param dbConnection The connection to be closed + */ + protected void close(Connection dbConnection) { + + // Do nothing if the database connection is already closed + if (dbConnection == null) + return; + + // Close our prepared statements (if any) + try { + preparedSizeSql.close(); + } catch (Throwable f) { + ; + } + this.preparedSizeSql = null; + + try { + preparedKeysSql.close(); + } catch (Throwable f) { + ; + } + this.preparedKeysSql = null; + + try { + preparedSaveSql.close(); + } catch (Throwable f) { + ; + } + this.preparedSaveSql = null; + + try { + preparedClearSql.close(); + } catch (Throwable f) { + ; + } + this.preparedClearSql = null; + + try { + preparedRemoveSql.close(); + } catch (Throwable f) { + ; + } + this.preparedRemoveSql = null; + + try { + preparedLoadSql.close(); + } catch (Throwable f) { + ; + } + this.preparedLoadSql = null; + + // Close this database connection, and log any errors + try { + dbConnection.close(); + } catch (SQLException e) { + log(sm.getString(getStoreName() + ".close", e.toString())); // Just log it here + } finally { + this.dbConnection = null; } - return conn; } /** @@ -815,7 +1002,7 @@ super.start(); // Open connection to the database - this.conn = getConnection(); + this.dbConnection = getConnection(); } /** @@ -827,74 +1014,13 @@ super.stop(); // Close and release everything associated with our db. - if(conn != null) { - try { - conn.commit(); - } catch (SQLException e) { - ; - } - - if( preparedSizeSql != null ) { - try { - preparedSizeSql.close(); - } catch (SQLException e) { - ; - } - } - - if( preparedKeysSql != null ) { - try { - preparedKeysSql.close(); - } catch (SQLException e) { - ; - } - } - - if( preparedSaveSql != null ) { - try { - preparedSaveSql.close(); - } catch (SQLException e) { - ; - } - } - - if( preparedClearSql != null ) { - try { - preparedClearSql.close(); - } catch (SQLException e) { - ; - } - } - - if( preparedRemoveSql != null ) { - try { - preparedRemoveSql.close(); - } catch (SQLException e) { - ; - } - } - - if( preparedLoadSql != null ) { - try { - preparedLoadSql.close(); - } catch (SQLException e) { - ; - } - } - + if (dbConnection != null) { try { - conn.close(); + dbConnection.commit(); } catch (SQLException e) { ; } - - this.preparedSizeSql = null; - this.preparedKeysSql = null; - this.preparedSaveSql = null; - this.preparedClearSql = null; - this.preparedRemoveSql = null; - this.preparedLoadSql = null; - this.conn = null; + close(dbConnection); } } } 1.4 +1 -0 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/LocalStrings.properties,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- LocalStrings.properties 11 Jan 2003 02:50:06 -0000 1.3 +++ LocalStrings.properties 9 Jan 2004 11:35:08 -0000 1.4 @@ -6,6 +6,7 @@ fileStore.loading=Loading Session {0} from file {1} fileStore.removing=Removing Session {0} at file {1} JDBCStore.alreadyStarted=JDBC Store has already been started +JDBCStore.close=Exception closing database connection {0} JDBCStore.notStarted=JDBC Store has not yet been started JDBCStore.saving=Saving Session {0} to database {1} JDBCStore.loading=Loading Session {0} from database {1}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]