Tomcat实现Session对象的持久化原理及配置方法介绍


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

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

实现:

要完成session持久化,存放在session里的对象必须要实现java.io.Serializable 接口。


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

org.apache.catalina.session.StandardManager  (默认)

org.apache.catalina.session.PersistentManager

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

配置:

Tomcat默认是已经启用持久化配置,若要禁用持久化功能,则只需要在<Context>节点里配置

<Manager pathname="" />;

         持久化配置可进行全局配置和针对某一站点进行配置。全局配置需要在cof文件夹context.xml的

<Context>节点中配置<Manager>,若要针对某一站点配置则需要在cof文件夹server.xml的<Host><Context>

节点中添加<Manager>配置。


1.StandardManager

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

<Manager

className=”org.apache.catalina.session.StandardManager” 

debug=”0”

maxInactiveInterval=”-1″

/>

注:如果突然终止该服务器,则所有会话都将丧失,因为StandardManager没有机会实现存盘处理。


2.PersistentManager

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

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

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

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

通过使用Store,将内存中的session备份到文件或数据库中。当备份一个session对象时,该session对象会被复制到存储器中,而原对象仍然留在内存中。因此如果服务器崩溃,就可以从存储器中获取活动的session对象。当session被换出时,他会被移动到存储器中,因为当前活动的session对象超过了上限值,或者session对象闲置了过长时间。换出session节省内存空间。

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


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

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

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

<Manager className="org.apache.catalina.session.PersistentManager" 
    debug="0"
    saveOnRestart="false"
    maxActiveSession="-1"
    minIdleSwap="-1"
    maxIdleSwap="-1"
    maxIdleBackup="-1">
    <Store className="org.apache.catalina.session.FileStore" directory="../session" />
</Manager>

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

<Store 

calssName="org.apache.catalina.JDBCStore"

driverName="com.mysql.jdbc.Driver" 
connectionURL="jdbc:mysql://localhost/tomsessionDB?user=root&password=" 
sessionTable="tomcat_session" 

sessionIdCol="session_id" 

sessionDataCol="session_data" 
sessionValidCol="session_valid" 

sessionMaxInactiveCol="max_inactive" 
sessionLastAccessedCol="last_access"

sessionAppCol="app_name" 

checkInterval="60" 

debug="99" />


参数说明:

maxActiveSessions-可处于活动状态的session数,default -1 不限制

checkInterval 检查session是否过期的时间间隔,default 60s

saveOnRestart-服务器关闭时,是否将所有的session保存到文件中;
minIdleSwap/maxIdleSwap
session处于不活动状态最短/长时间(s)sesson对象转移到File Store中;(1表示没有限制)
maxIdleBackup
超过这一时间,将session备份。(1表示没有限制)

directory-文件存储位置work\Catalina\host name\web app\session\文件名.session


可能出现的问题:

1、
严重: Cannot serialize session attribute '/test/ip/testAction!send.action for session 1B2631B649053493F0C787FB62917E3A.tomcatA 
严重:   storing attribute '/test/ip/testAction!send.action' with value NOT_SERIALIZED 

也就是说程序在运行的时候会把访问路径放到session中,但这个数据是没有序列化过的,导致反序列化的时候出错。 
2、
启动的tomcat在启动的时候警告:
警告: Manager [ org.apache.catalina.session.PersistentManager@1cc5d23] does not implement ClusterManager, addition to cluster has been aborted.

在关闭和重启Tomcat 5时, tomcat 会试图 serialize存在的session资源. 如果 sessions中相关的对象没有实现 serializable 接口, 就会出现Cannot serialize session attribute XXX  for  异常. 

如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of just exploding the war)  的  <Context> tags中间 加上 : 
<Manager className="org.apache.catalina.session.PersistentManager" 
saveOnRestart="false"/> 
这样 tomcat 在关闭的时候就不会保存session资源了. 


你也可以在server.xml中指定上面的值. 这也所有的程序都使用这个设置了.


猜你喜欢

转载自blog.csdn.net/dufufd/article/details/80009360