remm 2005/03/08 15:03:01 Modified: catalina/src/share/org/apache/catalina/realm JDBCRealm.java Log: - Add back the reconnection logic to JDBC realm, which was removed for wrong reasons. From what I saw, it causes major issues with MySQL otherwise (obviously, another solution is to use the better data source realm). Revision Changes Path 1.14 +100 -59 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JDBCRealm.java Index: JDBCRealm.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JDBCRealm.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- JDBCRealm.java 23 Feb 2005 19:27:56 -0000 1.13 +++ JDBCRealm.java 8 Mar 2005 23:03:01 -0000 1.14 @@ -521,40 +521,60 @@ PreparedStatement stmt = null; ResultSet rs = null; - try { - stmt = credentials(dbConnection, username); - rs = stmt.executeQuery(); - - if (rs.next()) { - dbCredentials = rs.getString(1); - } - rs.close(); - rs = null; - if (dbCredentials == null) { - return (null); - } - - dbCredentials = dbCredentials.trim(); - return dbCredentials; - - } catch(SQLException e){ - containerLog.error(sm.getString("jdbcRealm.getPassword.exception", - username), - e); - } finally { - if (rs!=null) { + // Number of tries is the numebr of attempts to connect to the database + // during this login attempt (if we need to open the database) + // This needs rewritten wuth better pooling support, the existing code + // needs signature changes since the Prepared statements needs cached + // with the connections. + // The code below will try twice if there is a SQLException so the + // connection may try to be opened again. On normal conditions (including + // invalid login - the above is only used once. + int numberOfTries = 2; + while (numberOfTries>0) { + try { + + // Ensure that we have an open database connection + open(); + try { + stmt = credentials(dbConnection, username); + rs = stmt.executeQuery(); + + if (rs.next()) { + dbCredentials = rs.getString(1); + } rs.close(); - } catch(SQLException e) { - containerLog.warn(sm.getString("jdbcRealm.abnormalCloseResultSet")); + rs = null; + if (dbCredentials == null) { + return (null); + } + + dbCredentials = dbCredentials.trim(); + return dbCredentials; + + } finally { + if (rs!=null) { + try { + rs.close(); + } catch(SQLException e) { + containerLog.warn(sm.getString("jdbcRealm.abnormalCloseResultSet")); + } + } + dbConnection.commit(); } - } - try { - dbConnection.commit(); + } catch (SQLException e) { - containerLog.warn(sm.getString("jdbcRealm.getPassword.exception", - username)); + + // Log the problem for posterity + containerLog.error(sm.getString("jdbcRealm.exception"), e); + + // Close the connection so that it gets reopened next time + if (dbConnection != null) + close(dbConnection); + } + + numberOfTries--; } return (null); @@ -582,41 +602,62 @@ PreparedStatement stmt = null; ResultSet rs = null; - try { - // Accumulate the user's roles - ArrayList roleList = new ArrayList(); - stmt = roles(dbConnection, username); - rs = stmt.executeQuery(); - while (rs.next()) { - String role = rs.getString(1); - if (null!=role) { - roleList.add(role.trim()); - } - } - rs.close(); - rs = null; - - return (roleList); - - } catch(SQLException e){ - containerLog.error(sm.getString("jdbcRealm.getRoles.exception", - username)); - } finally { - if (rs!=null) { + // Number of tries is the numebr of attempts to connect to the database + // during this login attempt (if we need to open the database) + // This needs rewritten wuth better pooling support, the existing code + // needs signature changes since the Prepared statements needs cached + // with the connections. + // The code below will try twice if there is a SQLException so the + // connection may try to be opened again. On normal conditions (including + // invalid login - the above is only used once. + int numberOfTries = 2; + while (numberOfTries>0) { + try { + + // Ensure that we have an open database connection + open(); + try { + // Accumulate the user's roles + ArrayList roleList = new ArrayList(); + stmt = roles(dbConnection, username); + rs = stmt.executeQuery(); + while (rs.next()) { + String role = rs.getString(1); + if (null!=role) { + roleList.add(role.trim()); + } + } rs.close(); - } catch(SQLException e) { - containerLog.warn(sm.getString("jdbcRealm.abnormalCloseResultSet")); + rs = null; + + return (roleList); + + } finally { + if (rs!=null) { + try { + rs.close(); + } catch(SQLException e) { + containerLog.warn(sm.getString("jdbcRealm.abnormalCloseResultSet")); + } + } + dbConnection.commit(); } - } - try { - dbConnection.commit(); + } catch (SQLException e) { - containerLog.warn(sm.getString("jdbcRealm.getRoles.exception", - username)); + + // Log the problem for posterity + containerLog.error(sm.getString("jdbcRealm.exception"), e); + + // Close the connection so that it gets reopened next time + if (dbConnection != null) + close(dbConnection); + } + + numberOfTries--; } - + return (null); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]