Tomcat - 持久化 Session

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,表示没有限制。

更多详情,请参考:

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

时间: 2024-10-20 19:23:25

Tomcat - 持久化 Session的相关文章

细说Tomcat之session持久化探秘

业务场景:通常,我们会在会话级别存放一些参数,期望在session生命周期内,可以一直取得保存在session中的指定数据:而只要session过期或者失效,则需要执行重新登录等操作.但是!我们对于这样的场景会感到很疑惑:在session中保存对象值,正常重启Tomcat,再次访问应用,居然还可以继续从session中取得之前保存的数据?理论上,Tomcat容器重启之后再次访问应用应该会创建一个新的session对象,不应该还能从之前的session中取得数据.这似乎是一种错觉!!! 原因:默认

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

tomcat(9)Session管理

[0]README 0.0)本文部分描述转自"深入剖析tomcat",旨在学习"tomcat-Session管理" 的基础知识: 0.1)Catalina通过一个称为Session 管理器的组件来管理建立的Session对象,该组件由org.apache.catalina.Manager接口来表示.(干货--catalina通过Session管理器组件来管理Session对象) 0.2)Session管理器:需要与一个Context容器相关联,且必须与一个Conte

Memcached做Tomcat的session共享

基于cache DB缓存的session共享 基于memcache/redis缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用. Tomcat集群session同步方式:1)使用tomcat自带的cluster方式,多个to

CentOS7 下 Nginx + Tomcat 实现 Session 共享

在之情的文章中搭建的 centos7 + tomcat + nginx 的环境的基础上, 使用 redis 实现 tomcat 的 session 共享的问题. 一 : 安装 Redis 安装 gcc: yum install -y gcc-c++ 使用 FTP 服务器上传安装包,解压上传的 redis 的包 tar -zxvf redis-3.0.0.tar.gz 进入解压目录 redis-3.0.0 执行 make PREFIX=/usr/local/redis install 把 redi

jetty热部署,持久化session,jetty-maven插件配置

持久化session 背景 使用maven管理项目,使用jetty插件启动项目,虽然jetty是热部署的,但是没有配置的jetty并不算真正的热部署.因为在没有配置前每次热部署都会把session丢了.导致测试期间的数据丢失,重来一遍很麻烦. 本人使用的是jetty-maven-plugin,关于这个插件的一些基本配置就不说了,网上很多. 配置代码pom <plugin> <groupId>org.mortbay.jetty</groupId> <artifact

Nginx+tomcat实现session共享

防伪码:人生没有对错,成功永远属于奋斗者 一.如何保持session会话 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案: 1.请求精确定位:sessionsticky,例如基于访问ip的hash策略,

高性能Web服务之Httpd负载均衡Tomcat实现Session Sticky及Session Cluster

Httpd负载均衡Tomcat实现Session Sticky及Session Cluster架构如下所示: 实现过程如下: 配置tomcat服务(tomcat1\tomcat2) (1)安装JDK # rpm -ivh jdk-7u9-linux-x64.rpm  --安装JDK后生成的文件 # cd /usr/java/ ; ll total 4 lrwxrwxrwx  1 root root   16 Sep 27 09:09 default -> /usr/java/latest drw

Nginx + tomcat + Memcached(session共享)

Nginx + tomcat + Memcached(session共享) 实验拓扑 nginx   实现负载 tomcat   实现web功能 memcached 实现会话共享 安装Nginx [[email protected] ~]# yum -y install pcre pcre-devel [[email protected] ~]# tar -zxvf nginx-1.0.5.tar.gz [[email protected] ~]# cd nginx-1.0.5 [[email