Session的持久化
Session的持久化:
Session的持久化就是将HttpSession对象从内存中转移到文件系统或数据库中,这样做的好处是:减少系统资源的占用,如果Servlet容器突然关闭或重启,或Web应用重启,这些持久化了的HttpSession对象可以再重新加载进来,对于客户端,还是使用同一个Session。
Session的持久化是由SessionManager来管理的,Tomcat提供了两个实现类:
lorg.apache.catalina.session.StandarManager
lorg.apache.catalina.session.PersistentManager
1、StandarManager是默认的SessionManager。它的实现机制是:当Tomcat服务器关闭或重启,或Web应用被重新加载时,会将内存中所有的HttpSession对象保存到文件系统中,默认的文件路径是:%CATALINA_HOME%\work\Catalina\<applicaton-name>\SESSIONS.ser
重启Tomcat后,Tomcat服务器把SESSIONS.ser中的持久化HttpSession对象加载到内存中。
2、PersistentManager能够把HttpSession对象保存到SessionStore中,它提供了比较StandarManager更灵活的管理功能,具有容错能力,控制内存中HttpSession对象的数目等。
Tomcat实现SessionStore的接口为org.apache.catalina.session.Store,目前提供了两个实现这一接口的类:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore会将HttpSession对象保存到文件系统中;而JDBCStore则将HttpSession对象保存到数据库表中。
下面给出这两个类的配置:
配置FileStore:
在server.xml中,在Web应用的<Context>元素加入<Manager>元素,例如:
<Contextpath=”/helloapp”docBase=”helloapp”debug=”0”reloadable=”true”>
<ManagerclassName=”org.apache.catalina.session.PersistentManager”>
debug=0;
saveOnRestart=”true”
maxActiveSessions=”-1”
minIdleSwap=”-1”
maxIdleSwap=”-1”
maxIdleBackup=”-1”
<StoreclassName=”org.apache.catalina.session.FileStore”directory=”mydir”/>
</Manager>
</Context>
属性
作用
className
指定SessionManager的实现类名,或SessionStore的实现类名
debug
设定SessionManager采用的跟踪级别,取值0到99,越小越跟踪信息越少,发布产品时,应该设置为0,以提高性能。
saveOnRestart
如果为true,则当Tomcat关闭时,所有的有效HttpSession对象都保存到SessionStore中;当Tomcat重启时,加载这些HttpSession对象。
maxActiveSessions
设置处于活动状态的Session的最大数目,如果超过这一数目,Tomcat把一些超过的Sessin对象保存到SessionStore中。-1表示不限制。
minIdleSwap
Session处于不活动状态的最小时间,单位为秒,超过这一时间,Tomcat有可能把这个Session对象移到SessionStore中。
maxIdleSwap
Session处于不活动状态的最大时间,超过这一时间,Tomcat就一定会将这个Session对象移到SessionStore中。
maxIdleBackup
Session处于不活动状态的最大时间,超过这一时间,Tomcat就就会将这个Session对象拷贝到SessionStore中进行备份。
directory
指定SessionStore在哪个文件系统目录下存放持久化的Session对象的信息,文件名是SessionID.session。
配置JDBCStore:
在server.xml中,在Web应用的<Context>元素加入<Manager>元素,例如:
<Contextpath=”/helloapp”docBase=”helloapp”debug=”0”reloadable=”true”>
<ManagerclassName=”org.apache.catalina.session.PersistentManager”>
debug=0;
saveOnRestart=”true”
maxActiveSessions=”-1”
minIdleSwap=”-1”
maxIdleSwap=”-1”
maxIdleBackup=”-1”
<StoreclassName=”org.apache.catalina.session.JDBCStore”
driverName=”com.mysql.jdbc.Driver”
connectionURL=”jdbc:mysql://localhost:3306/demo?user=rootpassword=1234”
sessionTable=”tomcat_sessions”
sessionIdCol=”session_id”
sessionDataCol=”session_data”
sessionValidCol=”session_valid”
sessionMaxInactiveCol=”max_inactive”
sessionLastAccessedCol=”last_access”
sessionAppCol=”app_name”
checkInterval=”60”
debug=”0”
/>
</Manager>
</Context>
说明:上面的元素属性的含义与FileStore的相同,上面的配置假设在MySQL服务器上的demo数据库的tomcat_sessions表中存放持久化Session对象的信息,这个表的结构如下:
CREATETABLEtomcat_sessions(
session_idVARCHAR(10)NOTNULLPRIMARYKEY,
session_dataMEDIUMBLOB,
session_validCHAR(1)NOTNULL,
max_inactiveINTNOTNULL,
last_accessBIGINTNOTNULL,
app_nameVARCHR(255),
KEYkapp_name(app_name)
);