org.eclipse.jetty.server.session
Class JDBCSessionManager

java.lang.Object
  extended by org.eclipse.jetty.util.component.AbstractLifeCycle
      extended by org.eclipse.jetty.server.session.AbstractSessionManager
          extended by org.eclipse.jetty.server.session.JDBCSessionManager
All Implemented Interfaces:
SessionManager, LifeCycle

public class JDBCSessionManager
extends AbstractSessionManager

JDBCSessionManager SessionManager that persists sessions to a database to enable clustering. Session data is persisted to the JettySessions table: rowId (unique in cluster: webapp name/path + virtualhost + sessionId) contextPath (of the context owning the session) sessionId (unique in a context) lastNode (name of node last handled session) accessTime (time in milliseconds session was accessed) lastAccessTime (previous time in milliseconds session was accessed) createTime (time in milliseconds session created) cookieTime (time in milliseconds session cookie created) lastSavedTime (last time in milliseconds session access times were saved) expiryTime (time in milliseconds that the session is due to expire) map (attribute map) As an optimization, to prevent thrashing the database, we do not persist the accessTime and lastAccessTime every time the session is accessed. Rather, we write it out every so often. The frequency is controlled by the saveIntervalSec field.


Nested Class Summary
protected  class JDBCSessionManager.ClassLoadingObjectInputStream
          ClassLoadingObjectInputStream
 class JDBCSessionManager.Session
          Session Session instance in memory of this node.
 class JDBCSessionManager.SessionData
          SessionData Persistable data about a session.
 
Nested classes/interfaces inherited from class org.eclipse.jetty.server.session.AbstractSessionManager
AbstractSessionManager.NullSessionContext, AbstractSessionManager.SessionIf
 
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
AbstractLifeCycle.AbstractLifeCycleListener
 
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle
LifeCycle.Listener
 
Field Summary
protected  String __deleteSession
           
protected  String __insertSession
           
protected  String __selectSession
           
protected  String __sessionTableRowId
           
protected  String __updateSession
           
protected  String __updateSessionAccessTime
           
protected  String __updateSessionNode
           
protected  long _saveIntervalSec
           
 
Fields inherited from class org.eclipse.jetty.server.session.AbstractSessionManager
__distantFuture, _checkingRemoteSessionIdEncoding, _context, _dftMaxIdleSecs, _httpOnly, _loader, _maxCookieAge, _nodeIdInSessionId, _refreshCookieAge, _secureCookies, _sessionAttributeListeners, _sessionCookie, _sessionDomain, _sessionHandler, _sessionIdManager, _sessionIdPathParameterName, _sessionIdPathParameterNamePrefix, _sessionListeners, _sessionPath, _sessionsStats, _sessionTimeStats
 
Fields inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
_listeners, FAILED, RUNNING, STARTED, STARTING, STOPPED, STOPPING
 
Fields inherited from interface org.eclipse.jetty.server.SessionManager
__CheckRemoteSessionEncoding, __DefaultSessionCookie, __DefaultSessionDomain, __DefaultSessionIdPathParameterName, __MaxAgeProperty, __SessionCookieProperty, __SessionDomainProperty, __SessionIdPathParameterNameProperty, __SessionPathProperty
 
Constructor Summary
JDBCSessionManager()
           
 
Method Summary
protected  void addSession(AbstractSessionManager.Session session)
          Add a newly created session to our in-memory list for this node and persist it.
 void cacheInvalidate(JDBCSessionManager.Session session)
          A method that can be implemented in subclasses to support distributed caching of sessions.
protected  void deleteSession(JDBCSessionManager.SessionData data)
          Delete a session from the database.
 void doStart()
          Start the session manager.
 void doStop()
          Stop the session manager.
protected  void expire(List sessionIds)
          Expire any Sessions we have in memory matching the list of expired Session ids.
 long getSaveInterval()
           
 JDBCSessionManager.Session getSession(String idInCluster)
          A session has been requested by it's id on this node.
 Map getSessionMap()
          Get all the sessions as a map of id to Session.
 int getSessions()
          Get the number of sessions.
protected  void invalidateSession(String idInCluster)
          Invalidate a session.
protected  void invalidateSessions()
           
protected  JDBCSessionManager.SessionData loadSession(String id, String canonicalContextPath, String vhost)
          Load a session from the database
protected  AbstractSessionManager.Session newSession(HttpServletRequest request)
          Make a new Session.
protected  void prepareTables()
           
 void removeSession(AbstractSessionManager.Session session, boolean invalidate)
          Remove session from manager
protected  boolean removeSession(String idInCluster)
          Delete an existing session, both from the in-memory map and the database.
 void setSaveInterval(long sec)
          Set the time in seconds which is the interval between saving the session access time to the database.
protected  void storeSession(JDBCSessionManager.SessionData data)
          Insert a session into the database.
protected  void updateSession(JDBCSessionManager.SessionData data)
          Update data on an existing persisted session.
protected  void updateSessionNode(JDBCSessionManager.SessionData data)
          Update the node on which the session was last seen to be my node.
 
Methods inherited from class org.eclipse.jetty.server.session.AbstractSessionManager
access, addEventListener, addSession, clearEventListeners, complete, getClusterId, getHttpOnly, getHttpSession, getIdManager, getMaxCookieAge, getMaxInactiveInterval, getMaxSessions, getMetaManager, getMinSessions, getNodeId, getRefreshCookieAge, getSecureCookies, getSessionCookie, getSessionCookie, getSessionDomain, getSessionHandler, getSessionIdPathParameterName, getSessionIdPathParameterNamePrefix, getSessionPath, getSessionsMax, getSessionsTotal, getSessionTimeMax, getSessionTimeMean, getSessionTimeStdDev, getSessionTimeTotal, isCheckingRemoteSessionIdEncoding, isNodeIdInSessionId, isUsingCookies, isValid, newHttpSession, removeEventListener, removeSession, resetStats, setCheckingRemoteSessionIdEncoding, setHttpOnly, setIdManager, setMaxCookieAge, setMaxInactiveInterval, setMetaManager, setNodeIdInSessionId, setRefreshCookieAge, setSecureCookies, setSessionCookie, setSessionDomain, setSessionHandler, setSessionIdPathParameterName, setSessionPath, setUsingCookies, statsReset
 
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
addLifeCycleListener, getState, getState, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.eclipse.jetty.util.component.LifeCycle
addLifeCycleListener, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
 

Field Detail

__insertSession

protected String __insertSession

__deleteSession

protected String __deleteSession

__selectSession

protected String __selectSession

__updateSession

protected String __updateSession

__updateSessionNode

protected String __updateSessionNode

__updateSessionAccessTime

protected String __updateSessionAccessTime

__sessionTableRowId

protected String __sessionTableRowId

_saveIntervalSec

protected long _saveIntervalSec
Constructor Detail

JDBCSessionManager

public JDBCSessionManager()
Method Detail

setSaveInterval

public void setSaveInterval(long sec)
Set the time in seconds which is the interval between saving the session access time to the database. This is an optimization that prevents the database from being overloaded when a session is accessed very frequently. On session exit, if the session attributes have NOT changed, the time at which we last saved the accessed time is compared to the current accessed time. If the interval is at least saveIntervalSecs, then the access time will be persisted to the database. If any session attribute does change, then the attributes and the accessed time are persisted.

Parameters:
sec -

getSaveInterval

public long getSaveInterval()

cacheInvalidate

public void cacheInvalidate(JDBCSessionManager.Session session)
A method that can be implemented in subclasses to support distributed caching of sessions. This method will be called whenever the session is written to the database because the session data has changed. This could be used eg with a JMS backplane to notify nodes that the session has changed and to delete the session from the node's cache, and re-read it from the database.

Parameters:
session -

getSession

public JDBCSessionManager.Session getSession(String idInCluster)
A session has been requested by it's id on this node. Load the session by id AND context path from the database. Multiple contexts may share the same session id (due to dispatching) but they CANNOT share the same contents. Check if last node id is my node id, if so, then the session we have in memory cannot be stale. If another node used the session last, then we need to refresh from the db. NOTE: this method will go to the database, so if you only want to check for the existence of a Session in memory, use _sessions.get(id) instead.

Specified by:
getSession in class AbstractSessionManager
Parameters:
idInCluster - The session ID in the cluster, stripped of any worker name.
Returns:
A Session or null if none exists.
See Also:
AbstractSessionManager.getSession(java.lang.String)

getSessionMap

public Map getSessionMap()
Get all the sessions as a map of id to Session.

Specified by:
getSessionMap in class AbstractSessionManager

getSessions

public int getSessions()
Get the number of sessions.

Overrides:
getSessions in class AbstractSessionManager
See Also:
AbstractSessionManager.getSessions()

doStart

public void doStart()
             throws Exception
Start the session manager.

Overrides:
doStart in class AbstractSessionManager
Throws:
Exception
See Also:
AbstractSessionManager.doStart()

doStop

public void doStop()
            throws Exception
Stop the session manager.

Overrides:
doStop in class AbstractSessionManager
Throws:
Exception
See Also:
AbstractSessionManager.doStop()

invalidateSessions

protected void invalidateSessions()
Specified by:
invalidateSessions in class AbstractSessionManager

invalidateSession

protected void invalidateSession(String idInCluster)
Invalidate a session.

Parameters:
idInCluster -

removeSession

protected boolean removeSession(String idInCluster)
Delete an existing session, both from the in-memory map and the database.

Specified by:
removeSession in class AbstractSessionManager
See Also:
AbstractSessionManager.removeSession(java.lang.String)

addSession

protected void addSession(AbstractSessionManager.Session session)
Add a newly created session to our in-memory list for this node and persist it.

Specified by:
addSession in class AbstractSessionManager
See Also:
AbstractSessionManager.addSession(org.eclipse.jetty.server.session.AbstractSessionManager.Session)

newSession

protected AbstractSessionManager.Session newSession(HttpServletRequest request)
Make a new Session.

Specified by:
newSession in class AbstractSessionManager
Returns:
the new session
See Also:
AbstractSessionManager.newSession(javax.servlet.http.HttpServletRequest)

removeSession

public void removeSession(AbstractSessionManager.Session session,
                          boolean invalidate)
Remove session from manager

Overrides:
removeSession in class AbstractSessionManager
Parameters:
session - The session to remove
invalidate - True if HttpSessionListener.sessionDestroyed(HttpSessionEvent) and SessionIdManager.invalidateAll(String) should be called.

expire

protected void expire(List sessionIds)
Expire any Sessions we have in memory matching the list of expired Session ids.

Parameters:
sessionIds -

prepareTables

protected void prepareTables()

loadSession

protected JDBCSessionManager.SessionData loadSession(String id,
                                                     String canonicalContextPath,
                                                     String vhost)
                                              throws Exception
Load a session from the database

Parameters:
id -
Returns:
the session data that was loaded
Throws:
Exception

storeSession

protected void storeSession(JDBCSessionManager.SessionData data)
                     throws Exception
Insert a session into the database.

Parameters:
data -
Throws:
Exception

updateSession

protected void updateSession(JDBCSessionManager.SessionData data)
                      throws Exception
Update data on an existing persisted session.

Parameters:
data -
Throws:
Exception

updateSessionNode

protected void updateSessionNode(JDBCSessionManager.SessionData data)
                          throws Exception
Update the node on which the session was last seen to be my node.

Parameters:
data -
Throws:
Exception

deleteSession

protected void deleteSession(JDBCSessionManager.SessionData data)
                      throws Exception
Delete a session from the database. Should only be called when the session has been invalidated.

Parameters:
data -
Throws:
Exception


Copyright © 1995-2011 Mort Bay Consulting. All Rights Reserved.