Session活化:从硬盘上读取序列化的session到内存中 Session钝化:把内存中的session序列化到硬盘上
session钝化机制是由sessionManager管理 tomcat提供了以下这两种session处理方式
org.apache.catalina.session.StandarManager
org.apache.catalina.session.Persistentmanager
StandarManager是tomcat的session默认处理方式,如果配置Persistentmanager则使用Persistentmanager,没有配置则使用StandarManager。
当Tomcat服务器关闭或者重启时tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中; 另一种情况是web应用程序被重新加载时(其实原理也是重启tomcat),内存中的session对象也会被钝化到服务器的文件系统中 当系统启动时,会把序列化到硬盘上session重新加载到内存中来。这样用户还保持这登录状态,提供系统的可用性。
可以将内存中长时间不用的session钝化到硬盘上,减少内存的占用。
比如:当网站有大量用户访问的时候,服务器会创建大量的session,会占用大量的服务器内存资源,当用户开着浏览器一分钟不操作页面的话建议将session钝化,将session生成文件放在tomcat工作目录下。
在 /WebRoot/META-INF 目录下创建 context.xml文件(也可以在tomca目录下的其他四个地方创建,在这里建是为了只对这个网站起作用),配置如下:
<?xml version="1.0" ?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="sessionDir" />
</Manager>
</Context>
在当前程序重新启动的时候,调用doLoad() 方法进行活化session
protected Map<String, Session> sessions = new ConcurrentHashMap<>();
这个方法迭代执行了所有在web.xml中注册的session活化的listener监听器。
expire方法是判断session是否过期,如果过期则执行所有在web.xml中注册过所有的HttpSessionListener的sessionDestroyed()方法
在当前程序关闭的时候,调用unLoad() 方法进行钝化session
通过 ContainerBase.startInternal() -> threadStart() 开启一个线程,定时的轮询所有的session,把长时间不使用(或者超出最大数量等)的session钝化到硬盘上。
每隔backgroupProcessorDelay时间轮询处理session。
PersistentManagerBase.processExpires() -> processPersistenceChecks()
Tomcat只是在下面三种情况会将Session通过Store保存起来:
下面只分析下第一种情况的源码processMaxIdleSwaps() 方法
调用store把session存储到指定的地方,如下面的配置,是把session钝化到硬盘文件中。
<Store className="org.apache.catalina.session.FileStore" directory="sessionDir" />
为当前查找的session设置一个lock。