Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@www.apache.org Received: (qmail 16339 invoked from network); 2 Nov 2004 19:08:58 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 2 Nov 2004 19:08:58 -0000 Received: (qmail 6656 invoked by uid 500); 2 Nov 2004 19:07:54 -0000 Delivered-To: apmail-jakarta-tomcat-dev-archive@jakarta.apache.org Received: (qmail 6538 invoked by uid 500); 2 Nov 2004 19:07:53 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 6525 invoked by uid 500); 2 Nov 2004 19:07:52 -0000 Received: (qmail 6521 invoked by uid 99); 2 Nov 2004 19:07:52 -0000 X-ASF-Spam-Status: No, hits=-10.0 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Tue, 02 Nov 2004 11:07:52 -0800 Received: (qmail 15967 invoked by uid 1923); 2 Nov 2004 19:07:51 -0000 Date: 2 Nov 2004 19:07:51 -0000 Message-ID: <20041102190751.15966.qmail@minotaur.apache.org> From: pero@apache.org To: jakarta-tomcat-catalina-cvs@apache.org Subject: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session JDBCStore.java PersistentManagerBase.java StoreBase.java mbeans-descriptors.xml X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N pero 2004/11/02 11:07:51 Modified: catalina/src/share/org/apache/catalina/session JDBCStore.java PersistentManagerBase.java StoreBase.java mbeans-descriptors.xml Log: Add processExpiresFrequency to PersistentManagerBase and made some small JDBCStore optimizations (pero) Revision Changes Path 1.11 +28 -30 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.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- JDBCStore.java 23 Jun 2004 13:51:36 -0000 1.10 +++ JDBCStore.java 2 Nov 2004 19:07:50 -0000 1.11 @@ -440,9 +440,6 @@ * @exception IOException if an input/output error occurred */ public String[] keys() throws IOException { - String keysSql = - "SELECT " + sessionIdCol + " FROM " + sessionTable + - " WHERE " + sessionAppCol + " = ?"; ResultSet rst = null; String keys[] = null; synchronized (this) { @@ -455,6 +452,9 @@ } try { if (preparedKeysSql == null) { + String keysSql = + "SELECT " + sessionIdCol + " FROM " + sessionTable + + " WHERE " + sessionAppCol + " = ?"; preparedKeysSql = _conn.prepareStatement(keysSql); } @@ -500,9 +500,6 @@ */ public int getSize() throws IOException { int size = 0; - String sizeSql = - "SELECT COUNT(" + sessionIdCol + ") FROM " + sessionTable + - " WHERE " + sessionAppCol + " = ?"; ResultSet rst = null; synchronized (this) { @@ -516,6 +513,9 @@ try { if (preparedSizeSql == null) { + String sizeSql = + "SELECT COUNT(" + sessionIdCol + ") FROM " + sessionTable + + " WHERE " + sessionAppCol + " = ?"; preparedSizeSql = _conn.prepareStatement(sizeSql); } @@ -562,11 +562,7 @@ ObjectInputStream ois = null; BufferedInputStream bis = null; Container container = manager.getContainer(); - String loadSql = - "SELECT " + sessionIdCol + ", " + sessionDataCol + " FROM " + - sessionTable + " WHERE " + sessionIdCol + " = ? AND " + - sessionAppCol + " = ?"; - + synchronized (this) { int numberOfTries = 2; while (numberOfTries > 0) { @@ -577,7 +573,11 @@ try { if (preparedLoadSql == null) { - preparedLoadSql = _conn.prepareStatement(loadSql); + String loadSql = + "SELECT " + sessionIdCol + ", " + sessionDataCol + " FROM " + + sessionTable + " WHERE " + sessionIdCol + " = ? AND " + + sessionAppCol + " = ?"; + preparedLoadSql = _conn.prepareStatement(loadSql); } preparedLoadSql.setString(1, id); @@ -607,8 +607,7 @@ _session = (StandardSession) manager.createEmptySession(); _session.readObjectData(ois); _session.setManager(manager); - - } else if (manager.getContainer().getLogger().isDebugEnabled()) { + } else if (manager.getContainer().getLogger().isDebugEnabled()) { manager.getContainer().getLogger().debug(getStoreName() + ": No persisted data object found"); } } catch (SQLException e) { @@ -649,9 +648,6 @@ * @exception IOException if an input/output error occurs */ public void remove(String id) throws IOException { - String removeSql = - "DELETE FROM " + sessionTable + " WHERE " + sessionIdCol + - " = ? AND " + sessionAppCol + " = ?"; synchronized (this) { int numberOfTries = 2; @@ -664,6 +660,9 @@ try { if (preparedRemoveSql == null) { + String removeSql = + "DELETE FROM " + sessionTable + " WHERE " + sessionIdCol + + " = ? AND " + sessionAppCol + " = ?"; preparedRemoveSql = _conn.prepareStatement(removeSql); } @@ -692,8 +691,6 @@ * @exception IOException if an input/output error occurs */ public void clear() throws IOException { - String clearSql = - "DELETE FROM " + sessionTable + " WHERE " + sessionAppCol + " = ?"; synchronized (this) { int numberOfTries = 2; @@ -705,6 +702,8 @@ try { if (preparedClearSql == null) { + String clearSql = + "DELETE FROM " + sessionTable + " WHERE " + sessionAppCol + " = ?"; preparedClearSql = _conn.prepareStatement(clearSql); } @@ -729,13 +728,6 @@ * @exception IOException if an input/output error occurs */ public void save(Session session) throws IOException { - String saveSql = - "INSERT INTO " + sessionTable + " (" + sessionIdCol + ", " + - sessionAppCol + ", " + - sessionDataCol + ", " + - sessionValidCol + ", " + - sessionMaxInactiveCol + ", " + - sessionLastAccessedCol + ") VALUES (?, ?, ?, ?, ?, ?)"; ObjectOutputStream oos = null; ByteArrayOutputStream bos = null; ByteArrayInputStream bis = null; @@ -767,6 +759,13 @@ in = new BufferedInputStream(bis, size); if (preparedSaveSql == null) { + String saveSql = + "INSERT INTO " + sessionTable + " (" + sessionIdCol + ", " + + sessionAppCol + ", " + + sessionDataCol + ", " + + sessionValidCol + ", " + + sessionMaxInactiveCol + ", " + + sessionLastAccessedCol + ") VALUES (?, ?, ?, ?, ?, ?)"; preparedSaveSql = _conn.prepareStatement(saveSql); } @@ -911,9 +910,8 @@ } catch (Throwable f) { ; } - this.preparedClearSql = null; - - try { + + try { preparedRemoveSql.close(); } catch (Throwable f) { ; 1.23 +81 -40 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java Index: PersistentManagerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/PersistentManagerBase.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- PersistentManagerBase.java 23 Oct 2004 00:16:08 -0000 1.22 +++ PersistentManagerBase.java 2 Nov 2004 19:07:50 -0000 1.23 @@ -130,7 +130,7 @@ /** * The descriptive information about this implementation. */ - private static final String info = "PersistentManagerBase/1.0"; + private static final String info = "PersistentManagerBase/1.1"; /** @@ -203,35 +203,76 @@ */ protected long processingTime = 0; + /** + * Frequency of the session expiration, and related manager operations. + * Manager operations will be done once for the specified amount of + * backgrondProcess calls (ie, the lower the amount, the most often the + * checks will occur). + */ + protected int processExpiresFrequency = 6; - // ------------------------------------------------------------- Properties + + /** + * Iteration count for background processing. + */ + private int count = 0; + // ------------------------------------------------------------- Properties /** - * Perform the background processes for this Manager + * Return the frequency of manager checks. */ - public void backgroundProcess() { + public int getProcessExpiresFrequency() { - long timeNow = System.currentTimeMillis(); + return (this.processExpiresFrequency); - this.processExpires(); - this.processPersistenceChecks(); - if ((this.getStore() != null) - && (this.getStore() instanceof StoreBase)) { - ((StoreBase) this.getStore()).processExpires(); + } + + + /** + * Set the manager checks frequency. + * + * @param processExpiresFrequency the new manager checks frequency + */ + public void setProcessExpiresFrequency(int processExpiresFrequency) { + + if (processExpiresFrequency <= 0) { + return; } - long timeEnd = System.currentTimeMillis(); - processingTime += ( timeEnd - timeNow ); + int oldProcessExpiresFrequency = this.processExpiresFrequency; + this.processExpiresFrequency = processExpiresFrequency; + support.firePropertyChange("processExpiresFrequency", + new Integer(oldProcessExpiresFrequency), + new Integer(this.processExpiresFrequency)); } + + /** + * Implements the Manager interface, direct call to processExpires and processPersistenceChecks + */ + public void backgroundProcess() { + count = (count + 1) % processExpiresFrequency; + if (count == 0) { + long timeNow = System.currentTimeMillis(); + + processExpires(); + processPersistenceChecks(); + if ((getStore() != null) && (getStore() instanceof StoreBase)) { + ((StoreBase) getStore()).processExpires(); + } + + long timeEnd = System.currentTimeMillis(); + processingTime += (timeEnd - timeNow); + } + } /** - * Indicates how many seconds old a session can get, after its last - * use in a request, before it should be backed up to the store. -1 - * means sessions are not backed up. - */ + * Indicates how many seconds old a session can get, after its last use in a + * request, before it should be backed up to the store. -1 means sessions + * are not backed up. + */ public int getMaxIdleBackup() { return maxIdleBackup; @@ -248,12 +289,12 @@ * means sessions are not backed up. *

* Note that this is not a hard limit: sessions are checked - * against this age limit periodically according to checkInterval. + * against this age limit periodically according to processExpiresFrequency. * This value should be considered to indicate when a session is * ripe for backing up. *

* So it is possible that a session may be idle for maxIdleBackup + - * checkInterval seconds, plus the time it takes to handle other + * processExpiresFrequency * engine.backgroundProcessorDelay seconds, plus the time it takes to handle other * session expiration, swapping, etc. tasks. * * @param backup The number of seconds after their last accessed @@ -331,12 +372,13 @@ /** - * Set the Container with which this Manager has been associated. If - * it is a Context (the usual case), listen for changes to the session - * timeout property. - * - * @param container The associated Container - */ + * Set the Container with which this Manager has been associated. If it is a + * Context (the usual case), listen for changes to the session timeout + * property. + * + * @param container + * The associated Container + */ public void setContainer(Container container) { // De-register from the old Container (if any) @@ -559,23 +601,23 @@ /** - * Invalidate all sessions that have expired. - */ - public void processExpires() { - - Session sessions[] = findSessions(); - - for (int i = 0; i < sessions.length; i++) { - sessions[i].isValid(); - } - } + * Invalidate all sessions that have expired. + */ + public void processExpires() { + + Session sessions[] = findSessions(); + + for (int i = 0; i < sessions.length; i++) { + sessions[i].isValid(); + } + + } /** - * Called by the background thread after active sessions have - * been checked for expiration, to allow sessions to be - * swapped out, backed up, etc. - */ + * Called by the background thread after active sessions have been checked + * for expiration, to allow sessions to be swapped out, backed up, etc. + */ public void processPersistenceChecks() { processMaxIdleSwaps(); @@ -1136,6 +1178,5 @@ } } - } 1.10 +9 -3 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StoreBase.java Index: StoreBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/StoreBase.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- StoreBase.java 23 Jun 2004 13:51:36 -0000 1.9 +++ StoreBase.java 2 Nov 2004 19:07:51 -0000 1.10 @@ -175,7 +175,7 @@ long timeNow = System.currentTimeMillis(); String[] keys = null; - if(!started) { + if(!started) { return; } @@ -185,7 +185,10 @@ manager.getContainer().getLogger().error("Error getting keys", e); return; } - + if (manager.getContainer().getLogger().isDebugEnabled()) { + manager.getContainer().getLogger().debug(getStoreName()+ ": processExpires check number of " + keys.length + " sessions" ); + } + for (int i = 0; i < keys.length; i++) { try { StandardSession session = (StandardSession) load(keys[i]); @@ -194,6 +197,9 @@ } if (session.isValid()) { continue; + } + if (manager.getContainer().getLogger().isDebugEnabled()) { + manager.getContainer().getLogger().debug(getStoreName()+ ": processExpires expire store session " + keys[i] ); } if ( ( (PersistentManagerBase) manager).isLoaded( keys[i] )) { // recycle old backup session 1.10 +5 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/mbeans-descriptors.xml Index: mbeans-descriptors.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/session/mbeans-descriptors.xml,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- mbeans-descriptors.xml 5 Oct 2004 17:12:52 -0000 1.9 +++ mbeans-descriptors.xml 2 Nov 2004 19:07:51 -0000 1.10 @@ -181,7 +181,11 @@ description="The default maximum inactive interval for Sessions created by this Manager" type="int"/> - + + +