Tomcat实现Session对象的持久化

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

Session的持久化是由Session Manager来管理的。

Tomcat提供了两个实现类:

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

org.apache.catalina.session.PersistentManager

 

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资源了. 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值