教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

Java培训:Tomcat中session的钝化与活化机制详解

更新时间:2020年12月28日16时21分 来源:传智教育

  JavaEE提供了8个监听器,其中一个是HttpSessionActivationListener,用来监听session当中JavaBean对象的钝化与活化状态。那么什么是钝化与活化呢?session的钝化与活化又有什么作用呢?本节我们来详细探讨这些问题。

  一、什么是钝化与活化

  首先,第一个问题,什么是钝化?什么是活化?钝化和活化原本是化学中的术语,钝化指把金属表面转换成不容易氧化、不易被锈蚀的状态,也就是不活跃状态;活化又称激发,把物体变成活跃状态。

  JavaEE借鉴了这两个概念,用来表示Java对象的状态变化:

  · 钝化:把一个Java对象序列化保存到磁盘文件上

  · 活化:把磁盘文件里的数据,反序列化恢复到内存中形成一个Java对象

  其次,并不是任意一个Java对象都可以被钝化的:

  · 这个类必须要实现java.io.Serializable接口

  · 类里的属性也要实现java.io.Serializable接口

  二、session的钝化与活化

  在JavaEE中,最常见的就是HttpSession对象的钝化与活化了:当服务器软件关闭时,HttpSession对象并不是销毁了,而是被序列化保存到了磁盘文件上;当服务器重新启动时,磁盘文件上保存的数据又被恢复到内存中,重新转换成了HttpSession对象,演示过程如下:

  1. 创建web应用,然后创建一个Servlet,在Servlet里获取一个session对象,代码如下:

public class DemoActivationServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
ServletException, IOException {

HttpSession session = request.getSession();
System.out.println("服务端已经创建一个session对象,session的id是:" + session.getId());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws 
ServletException, IOException {
doGet(request, response);
}
}

  2. 把web应用部署到Tomcat里,启动Tomcat

  3. 使用浏览器访问刚刚创建的Servlet,会得到一个session对象在内存中,控制台打印如下内容:

  4. 正常关闭Tomcat,打开tomcat的安装目录里work\Catalina\localhost\web应用的文件夹 ,发现多了一个文件SESSIONS.ser,如下图:

  查看文件内容:

  这个文件SESSIONS.ser就是被钝化的session对象文件。session已经被成功钝化

  5. 当Tomcat重启时,SESSIONS.ser文件消失了,已经被恢复到内存中形成了HttpSession对象

  三、session的钝化与活化的用处

  session的钝化与活化,可以有效减轻服务器的压力,提升服务器的负载能力。

  1. 有限的内存与大量会话需要更多内存空间的矛盾

  当我们把web应用程序部署以后,每一个会话的开启,服务端都要为其创建一个session对象。这些session对象被保存在服务器的内存当中,直到会话超时,或者结束会话,session对象才会被销毁。

  但是服务器的内存是有限的,如果web应用的访问量比较大,那么很快服务器中就会有大量的session对象存在,服务器的内存压力会迅速上升。

  2. 矛盾的解决思路:把内存中不活跃的session对象钝化保存到磁盘文件中,留出更多的内存空间

  在服务器内存中有大量的session对象,但并不是所有的session都是活跃状态的。比如:一个用户访问进来然后很快关闭了浏览器,或者很久没有再次访问。但是session仍然没有被销毁,占用了内存空间。

  如果能把这些不活跃的session对象,钝化保存到磁盘文件上,那么服务器就可以腾出内存空间,支持更多的访问了。等到这些用户再访问时,就把磁盘文件活化恢复成为内存中的session对象

  四、Tomcat的钝化与活化机制介绍

  Tomcat提供了两种session钝化与活化的管理机制:StandardManager和PersistentManager。其中:StandardManager是Tomcat的默认session管理机制,而PersistentManager需要进行配置才会生效。

  1. StandardManager管理session

  session钝化:当Tomcat被关闭,或者重启时,会把session对象钝化保存到磁盘文件上;

  session活化:当Tomcat启动时,会把保存在磁盘上的文件进行反序列化,恢复到内存中形成一个session对象。

  注意:强制kill掉Tomcat,是不会把session钝化到磁盘上的

  2. PersistentManager管理session

  配置这种方式,可以将长时间不用的session对象钝化到磁盘上,减少内存的占用。

  比如:当web应用有大量用户访问量,服务器会创建大量的session对象,占用大量的内存资源。我们可以设置:当用户一分钟不操作时,就把session钝化,生成文件保存到磁盘上。当用户再访问时,Tomcat会把磁盘文件反序列化恢复成为session对象。

  五、Tomcat的session钝化机制配置

  那么应该怎样进行配置呢?Tomcat提供了很多种配置方式,这里介绍三种:

  1. 配置方式一:在web应用的META-INF目录下,创建一个context.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- className:指定session管理对象是PersistentManager   maxIdleSwap:配置多长
时间不访问就钝化session -->
<Manager className="org.apache.catalina.session.PersistentManager"
 maxIdleSwap="1">
<!-- 
className:指定钝化session时生成文件的管理类    
directory:指定生成的文件保存的文件夹(tomcat\work\Catalina\localhost\web应用
名称\指定的文件夹) 
-->
<Store className="org.apache.catalina.session.FileStore" directory="itheima"></Store>
</Manager>
</Context>

  只针对当前web应用有效

  2. 配置方式二:修改Tomcat的conf\server.xml,在Host标签中增加子标签内容如下:

<!-- 
docBase:部署的web应用的路径,可以写web应用的绝对路径,也可以写webapps
中的web应用文件夹名称
path:web应用的访问路径,也就是contextPath 
-->
<Context docBase="activation" path="/activation" reloadable="true">
<Manager className="org.apache.catalina.session.PersistentManager" 
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>

  Context标签中的docBase,配置的哪个web应用,就针对哪个web应用生效。

  可以有多个Context标签,分别给不同的web应用进行配置

  3. 配置方式三:修改Tomcat的conf\context.xml,在Context标签里增加子标签内容如下:

<Manager className="org.apache.catalina.session.PersistentManager"
 maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"></Store>
</Manager>

  注意:这种方式,对Tomcat里部署的每一个web应用都会生效。在Tomcat\work\catalina\localhost目录下,每个web应用的文件夹里都会有一个itheima文件夹,用来保存自己的web应用里钝化的session对象