Session 是保存在内存中的,如果服务器重启、宕机的话,Session 就会丢失。有时候,我们需要对 Session 持久化以应对意外的情况发生。例如,客户端与服务器在交互过程中,可能因为 Session 的丢失而造成数据的丢失。还有一种情况,我们需要持久化 Session。如果当前用户的访问量巨大,大量的 Session 便会占用服务器大量的内存,从而使服务器的性能受到影响。如果能将一些闲置时间较长的 Session 换出,存储至磁盘,便可以起到节省内存空间的作用。

需要注意的一点是,要持久化 Session,那么 Session 里存放的对象必须是可序列化的,即实现了 java.io.Serializable 接口。

Tomcat 通过两个 Session 管理类来实现 Session 的持久化:org.apache.catalina.session.StandardManager 和 org.apache.catalina.session。 可以通过 $CATALINA_HOME/conf/context.xml 的 <Manager> 节点来配置 Session 的持久化方式。Tomcat 默认已经启动了持久化配置,若要禁用持久化功能,只需在 <Context>节点里配置 <Manager pathname="" />。

StandardManager

这是 Tomcat 默认的 Session 管理类。StandardManager 不会使用任何的 Store 来存储 session,当 Tomcat 正常关闭、重启或 Web 应用程序重新加载时,StandardManager 会将内存中的 session 序列化到 $CATALINA_HOME/work/Catalina/hostname/webappname/SESSIONS.ser 文件中。当 Tomcat 重启或 Web 应用程序加载完毕后,Tomcat 会反序列化将 session 还原至内存。需要注意的是,如果服务器没有正常关闭而崩溃或被终止,则所有的 session 都会丢失,因为 StandardManager 没有机会实现序列化持久存储处理。

PersistentManager

PersistentManager 通过使用 Store 将内存中的 session 拷贝至文件或数据库中。如果当前活动的 session 对象数量超过了上限值或者 session 对象闲置了过长时间,就会有 session 对象就会被换出,存储到磁盘中,以节省内存空间。当 Tomcat 正常关闭、重启或 Web 应用程序重新加载时,PersistentManager  也会像 StandardManager 一样,将 session 对象持久化到磁盘中。当 session 对象复制存储至磁盘中,原 session 对象可能仍存留在内存中。因此,如果 Web 应用突然非正常终止或服务器崩溃了,当服务器重启,Web 应用重新加载的时候,便可以从磁盘中还原已持久化的 session。

Store 有两种:FileStore 和 JDBCStore,分别用作于将 session 存储至文件和数据库。

FileStore

FileStore 用作于将 session 存储至文件,通过 <Store/> 元素的 directory 属性指定文件所在的目录。

<?xml version="1.0" encoding="utf-8"?>
<Context>
  <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"
  maxActiveSession="-1" minIdleSwap="0" maxIdleSwap="30" maxIdleBackup="0">
<Store className="org.apache.catalina.session.FileStore" checkInterval="60" directory="./session"/>
</Manager>
</Context>

上述的配置,session 对象将会被存储至 $CATALINA_HOME/work/Catalina/hostname/webappname/session/sessionID.session 文件中。

JDBCStore

JDBCStore 用作于将 session 存储至数据库。

1. context.xml 的配置:

<?xml version="1.0" encoding="utf-8"?>
<Context> <Manager className="org.apache.catalina.session.PersistentManager"
maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1">
<Store className="org.apache.catalina.session.JDBCStore"
  driverName="com.mysql.jdbc.Driver"
   connectionURL="jdbc:mysql://localhost:3306/tomcat?user=root&amp;password=root"
   sessionTable="tomcat_sessions"
   sessionIdCol="session_id"
   sessionDataCol="session_data"
   sessionValidCol="session_valid"
   sessionMaxInactiveCol="max_inactive"
   sessionLastAccessedCol="last_access"
   sessionAppCol="app"
  checkInterval="60"/>
</Manager> </Context>

2. 数据库配置,注意需要在 $CATALINA_HOME/lib 目录添加数据库对应的驱动包:

DROP TABLE IF EXISTS tomcat_sessions ;
CREATE TABLE tomcat_sessions (
session_id VARCHAR(100) NOT NULL PRIMARY KEY,
session_data MEDIUMBLOB,
session_valid VARCHAR(16) NOT NULL,
max_inactive INT NOT NULL,
last_access BIGINT NOT NULL,
app VARCHAR (255),
INDEX (app)
);

<Manager> 部分参数说明

maxActiveSessions:可处于活动状态的 session 的数量的上限值,默认值为 -1,表示没有限制。

minIdleSwap:session 可闲置的最短时间,超过该时间,Manager 可能会把 session 持久化到 Store 中,该 session 不会存留在内存中。单位为秒,默认值为 -1,表示没有限制。

maxIdleSwap:session 可闲置的最长时间,超过该时间,Manager 将会把 session 持久化到 Store 中,该 session 不会存留在内存中。单位为秒,默认值为 -1,表示没有限制。

maxIdleBackup:可闲置的时间,超过该时间,Manager 将会把 session 持久化到 Store 中,但该 session 对象仍然存留在内存中。单位为秒,默认值为 -1,表示没有限制。

更多详情,请参考:

https://tomcat.apache.org/tomcat-6.0-doc/config/manager.html

Tomcat - 持久化 Session的更多相关文章

  1. 细说tomcat之session持久化探秘

    业务场景:通常,我们会在会话级别存放一些参数,期望在session生命周期内,可以一直取得保存在session中的指定数据:而只要session过期或者失效,则需要执行重新登录等操作.但是!我们对于这 ...

  2. Tomcat 之session 持久化2

    通过前文 Tomcat 之session 持久化1 ,我们已经大概了解了这么个机制.但是我没能详细展开其底层的原理. 这篇文章,我想稍微深入一点点,再继续聊一聊其底层. Tomcat 之session ...

  3. Tomcat 之session 持久化1

    Tomcat 之session 持久化原理 几个概念: Manager 接口,其实就是指的是对  其Sesison 的管理, 其默认实现是StandardManager (内部没有任何Store对象实 ...

  4. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  5. Tomcat下 session 持久化问题(重启服务器session 仍然存在)

    感谢大佬:https://www.iteye.com/blog/xiaolongfeixiang-560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionLi ...

  6. 【Session】Tomcat中Session的外置

    > 参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化. ...

  7. Tomcat中session的管理机制

    1.       请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...

  8. Nginx+Tomcat关于Session的管理

    前言 Nginx+Tomcat对Session的管理一直有了解,但是一直没有实际操作一遍,本文从最简单的安装启动开始,通过实例的方式循序渐进的介绍了几种管理session的方式. nginx安装配置 ...

  9. tomcat 设置session过期时间(四种方式)

    1.在tomcat-->conf-->servler.xml文件中定义: <Context path="/test" docBase="/test&qu ...

随机推荐

  1. HDU 3664 Permutation Counting (DP)

    题意:给一个 n,求在 n 的所有排列中,恰好有 k 个数a[i] > i 的个数. 析:很明显是DP,搞了好久才搞出来,觉得自己DP,实在是太low了,思路是这样的. dp[i][j]表示 i ...

  2. oracle 全文检索技术

    1.查看用户: select * from dba_users WHERE username='CTXSYS';select * from dba_users WHERE username='CTXS ...

  3. ECSHOP数据表结构完整仔细说明教程

    From:http://www.ecshop119.com/ecshopjc-868.html s_account_log //用户账目日志表 字段 类型 Null 默认 注释 log_id medi ...

  4. Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  5. mysql5.5主从配置

    mysql主从同步# 一:mysql数据库的主从 mysql数据库5.5之后的版本和5.5以前的版本数据库主从存在差异,这里是针对数据库5.5之后的配置. 1.主库编辑my.cnf(linux的my. ...

  6. [置顶] 《Windows编程零基础》__2 一个完整的程序

    Windows开发的常识 1)窗口 Windows中最基本的概念也许就是窗口了,每一个前台程序都至少有一个窗口,一个窗口也是你可以看到的部分,比如,QQ有如下的登录窗口 基本上你在Windows中可见 ...

  7. iptables实战系列:通过NAT转发实现私网对外发布信息

    原文地址: http://os.51cto.com/art/201109/289486.htm [51CTO独家特稿]本文将介绍一个使用iptables实现NAT转发功能的案例. 本文假设读者已经对N ...

  8. HTML输出 二 控制行背景颜色

    $Infors = Get-Content ports01.txt$Temp_PortStatustxt = "C:\Windows\Temp\PortStatustxt.txt" ...

  9. Arduino 4X3键盘 AD模拟分量实现

    //读分量测试 ---------------- ; //模拟口0 ; // 取得键AD模拟分量 void setup() { //通信波特率 Serial.begin(); } void loop( ...

  10. Android BLE开发之Android手机搜索iBeacon基站

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次讲了Android手机与BLE终端之间的通信,而最常见的BLE终端应该是苹果公司倡导的iBeacon基站. ...