更新时间:2021年03月18日 08时58分11秒 来源:黑马程序员
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对象