三、服务器调优
  PGxHRU72vIL4 2023年11月02日 39 0

(一)问题
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的活化了。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ehrZuhofWJiC   2024年04月26日   40   0   0 日志Java
  ehrZuhofWJiC   2024年05月17日   39   0   0 服务器linux
PGxHRU72vIL4