## org.eclipse.jetty.server.session
Class JDBCSessionManager

    java.lang.Object
      org.eclipse.jetty.util.component.AbstractLifeCycle
          org.eclipse.jetty.server.session.AbstractSessionManager
              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, 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-2010 Mort Bay Consulting. All Rights Reserved.