|
最近对tomcat比较感兴趣,会陆续的发一些学习tomcat的心得。
今天看的是tomcat session持久化,关于session持久化我上官网上除了API没有找到相关的文档,只有在其它论坛网站上有很多哥们提到了。
所谓session持久化就是将内存中的session保存到磁盘(文件)中,Tomcat有两种标准的持久化方案:
一种是保存在文件,另外一种是保存在数据库中。虽然session持久化用的很少,了解下还是可以的。
默认情况下Tomcat提供的是StandardManager管理
org.apache.catalina.session.StandardManager
StandardManager 里面提供了很多参数来管理,诸如maxActiveSessions,pathname,
maxInactiveInterval.... 还提供了load和unload方法来加载和持久化session。
修改配置文件catalina_home/conf/context.xml,取消注释的Manager
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
当你正常关闭(直接关闭进程不算)tomcat的时候,tomcat会将session保存在 catalina_home/work/catalina/localhost/项目名称/session.ser文件中。
一、保存在文件中
StandardManager可以保存在文件中,还有FileLoad也可以保存在文件中,不过FileLoad需要PersistentManager的帮助。这对我们来说更加的方便了,因为持久化逻辑,和持久化的动作分开了。
我们在catalina_home/conf/context.xml中添加如下配置信息:
<Manager className="org.apache.catalina.session.PersistentManager">
debug=0
saveOnRestart="true"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdelSwap="-1"
<Store className="org.apache.catalina.session.FileStore" directory="../session"/>
</Manager>
重启之后,让服务器产生session,然后正常关闭。
持久化的session文件在catalina_home/work/catalina/localhost/session下
二、保存在数据库中
使用tomcat中
org.apache.catalina.JDBCStore
具体参数看源码吧,这里我上网上找了一个配置:
<Store calssName="org.apache.catalina.JDBCStore" driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/session?usename=xxx&password=xxx"
sessionTable="session" sessionIdCol="session_id" sessionDataCol="session_data"
sessionValidCol="sessionValid" sessionMaxInactiveCol="maxInactive"
sessionLastAccessedCol="lastAccess" sessionAppCol="appName" checkInterval="60" debug="99" />
这样就能把session 保存到数据库中了。
三、自定义存储方式
看看三个类之间的关系:
StandardManager extends ManagerBase
PersistentManager extends PersistentManagerBase
PersistentManagerBase extends ManagerBase
FileStore extends StoreBase
JDBCStore extends StoreBase
所以我们如果想改变存储的方式,如果想存缓存中(eg: memcached这样的)
我们可以写一个类继承StoreBase即可,我这里写了一个简单的,里面什么功能都没有,只是一些简单的systemout 来演示下:
package cn.tang;
import org.apache.catalina.Session;
import org.apache.catalina.session.StoreBase;
public class MySessionStore extends StoreBase{
public Session load(String s) throws ClassNotFoundException, IOException {
System.out.println("---------invoke load method------------");
return null;
}
public void remove(String s) throws IOException {
System.out.println("---------invoke remove method------------");
}
public void save(Session session) throws IOException {
System.out.println("---------invoke save method------------");
}
public void clear() throws IOException {
System.out.println("---------invoke save method------------");
}
public int getSize() throws IOException {
System.out.println("---------invoke save method------------");
return 0;
}
public String[] keys() throws IOException {
System.out.println("---------invoke save method------------");
return null;
}
}
打成一个jar包,放入catalina_home/lib中,同理修改context.xml文件
<Manager className="org.apache.catalina.session.PersistentManager">
debug=0
saveOnRestart="true"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdelSwap="-1"
<Store className="cn.tang.MySessionStore"/>
</Manager>
重启之后,你会发现每个方法会有输出,关于如果写入到第三方缓存中,这是另一个话题了,有机会再说。
PS: 关于Session和Memcached已经有成熟的解决方案了,感兴趣的可以看下面的链接,
https://github.com/magro/memcached-session-manager |
|
|