(一)问题
1、问题一
每个用户访问一个网站都会单独享有一个session
,而session
是存储在内存中的。当有大量的用户访问网站时,就会占用大量的内存,而此时若好多session都是无效操作(比如:一个用户将商品添加进购物车之后就去吃饭了,网页没有关闭,那么服务器依然会保存这个session
,这种session
就属于短期无效session
),那么就会白白浪费服务器的性能,并影响后续的用户体验。
2、问题二
当用户访问时,服务器突发异常,一旦服务器宕机,那么存储在内存中的所有session
都会丢失。为了用户体验,明显不能丢掉session,所有也必须采用文件存储。
(二)调优
调优一:硬件调优。增加机器,将服务器扩展成集群,无限增大内存(经济成本增加)
调优二:软件调优。将短时间内不用的session持久化到硬盘中,当用户再用时,将持久化到硬盘中的数据再加载到session中。(简单、高效,但依然存在内存瓶颈)
(三)软件调优的具体实现
1、背景介绍
class Customer implements HttpSessionActivationListener,Serializable
必须实现这两个接口,实现session活化和钝化的要求
活化:从硬盘上读取到内存中
纯化:从内存中写到硬盘上
HttpSessionActivationListener
实现此接口的JavaBean,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程。
如果需要同时保存Session中的JavaBean则JavaBean也要实现Serializable序列化接口。
实现此接口的JavaBean与HttpSessionBindingListener一样,不必配置到web.xml中。
2、实现HttpSessionActivationListener
,Serializable
接口
package org.pc.bean;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
/**
* @author 咸鱼
* @date 2018/8/16 10:23
*/
public class Customer implements HttpSessionActivationListener,Serializable {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/**
* 钝化:从内存中写到硬盘上
* @param httpSessionEvent
*/
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("session钝化!");
}
/**
* 活化:从硬盘上读取到内存中
* @param httpSessionEvent
*/
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("session活化!");
}
}
3、配置session钝化、活化的配置文件(仅适用于tomcat容器)
(1)在webapp目录下创建一个META-INF
文件件
(2)新建一个context.xml
文件,文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 单位:min -->
<!-- saveOnRestart:服务器重启时,是否保存session -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下(必须指定一个目录,否则服务器重启之后,保存的session文件就被删除了) -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1" saveOnRestart="true">
<Store className="org.apache.catalina.session.FileStore" directory="e:\session" />
</Manager>
</Context>
这样就可以实现session的活化了。