【转】java tomcat实现Session对象的持久化原理及配置方法介绍

  对于一个企业级应用而言,Session对象的管理十分重要。Sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场...

    对于一个企业级应用而言,Session对象的管理十分重要。Sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在Session中的数据需要实现可序列化接口(java.io.Serializable)的原因了。

    当一个Session开始时,Servlet容器会为Session创建一个HttpSession对象。Servlet容器在某些情况下把这些HttpSession对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession信息时再把它们加载到内存中。

Session的持久化是由Session Manager来管理的。Tomcat提供了两个实现类

org.apache.catalina.session.StandardManager  

org.apache.catalina.session.PersistentManager

下面分别就StandardManager和PersistentManager两种实现进行介绍。

1.StandardManager

  StandardManager是默认的Session Manager。它的实现机制为:当Tomcat服务器关闭或重启,或者Web应用被重新加载时,会对在内存中的HttpSession对象进行持久化,并把它们保存到文件系统中,默认的文件为<CATALINA_HOME>/work/Catalina/hostname/ applicationname/SESSIONS.ser。

2.PersistentManager

  PersistentManager能够把Session对象保存到Session Store中,它提供了比 StandardManager更为灵活的Session管理功能,它具有以下功能:

  对内存中的HttpSession对象进行持久化,把它们保存到Session Store中。

  具有容错功能,可以及时把Session备份到Session Store中,当Tomcat服务器意外关闭后再重启时,可以从Session Store中恢复Session对象。

  可以灵活控制在内存中的Session数目,将部分Session转移到Session Store中。

   Tomcat实现持久化Session Store的接口为org.apache.Catalina.store,目前提供了两个实现这一接口的类,即org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore。

实现配置PersistentManager大多是两种形式

形式一:存储在本地文件中需要配置conf目录里的context.xml文件

在<Context>节点下添加如下<Manager>节点:

1
2
3
4
5
6
7
8
9
<Manager className="org.apache.catalina.session.PersistentManager" >
    debug=0
    saveOnRestart="true"
    maxActiveSession="-1"
    minIdleSwap="-1"
    maxIdleSwap="-1"
    maxIdleBackup="-1"
    <Store className="org.apache.catalina.session.FileStore" directory="../session" />
</Manager>

形式二:存储在数据库中需要配置store节点 

1
2
3
4
5
<Store calssName="org.apache.catalina.JDBCStore" driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/session?usename=xxx&password=xxx"
sessionTable="session" sessionIdCol="session_id" sessionDataCol="session_data"
sessionValidCol="sessionValid" sessionMaxInactiveCol="maxInactive"
sessionLastAccessedCol="lastAccess" sessionAppCol="appName" checkInterval="60" debug="99" />