Servlet Session的持久化

 

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

 

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

org.apache.catalina.session.StandardManager

org.apache.catalina.session.PersistentManager

 

1.StandardManager

Standard Manager 是默认的 Session Manager. 它的实现机制为:当 Tomcat 服务器关闭或重启,或者 web 应用被重新加载时,会对在内存中的 HttpSession 对象进行持久化,把它们保存到文件系统中,默认的文件为:

<CATALINA_HOME>/work/Catalina/hostname/applicationname/SESSIONS.ser

2.PersistentManager

PersistentManager 能够把 Session 对象保存到 Session Stor 中,它提供了比 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 以及两种持久化 Session Store.

 

配置 FileStore

 

FileStore HttpSession 对象保存在一个文件中。这个文件的默认目录为

<CATALINA_HOME>/work/Catalina/hostname/applicationname. 每个 HttpSession 对象都会对应一个文件,它以 Session ID 作为文件名,扩展名为: .session.

 

例:为 helloapp 应用配置 FileStore

Server.xml

<!-- configure FileStore -->

<Context path="/helloapp" docBase="helloapp" debug="0"

reloadable="true">

 

<Manager className="org.apache.catalina.session.PersistentManager" >

debug=0;

saveOnRestart="true"

maxActiveSessions="-1"

minIdleSwap="-1"

maxIdleSwap="-1"

maxIdleBackup="-1"

<Store className="org.apache.catalina.session.FileStore" directory="mydir" />

</Manager>

 

</Context>

 

 

配置 JDBCStore

 

JDBCStore HttpSession 对象保存在数据为库的一张表中。

 

例: MySQL 中创建 Session 表的步骤,假定表的名字为 tomcat_sessions, 这张表所在的数据库为tomcatsessionDB.

 

CREATE DATABASE tomcatsessionDB;

Use tomcatsessionDB

Create table tomcat_session(

session_id varchar(100) not null primary key,

valid_session chart(1)not null,

max_inactive int not null,

last_access bigint not null,

app_name varchar (255),

session_data mediumblob,

KEY kapp_name(app_name)

};

 

 

Server.xml

<!-- configure JDBCStore -->

<Context path="/helloapp" docBase="helloapp" debug="0"

reloadable="true">

 

<Manager className="org.apache.catalina.session.PersistentManager" >

debug=99;

saveOnRestart="true"

maxActiveSessions="-1"

minIdleSwap="-1"

maxIdleSwap="-1"

maxIdleBackup="-1"

<Store className="org.apache.catalina.session.JDBCStore"

driverName="com.mysql.jdbc.Driver"

connectionURL="jdbc:mysql://localhost/tomcatsessionDB?user=dbuser;password=1234"

sessionTable="tomcat_sessions"

sessionIdCol="session_id"

sessionDataCol="session_data"

sessionValidCol="valid_session"

sessionMaxInactiveCol="max_inactive"

sessionLastAccessedCol="last_access"

sessionAppCol="app_name"

checkInterval="60"

debug="99"

/>

</Manager>

 

</Context>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值