listener使用之-实现Cache

[align=center][b]Listener使用[/b][/align]
进行Web开发时,常常会遇到一些数据需要经常用到,这些数据都是更新频率较小,但是各个页面频繁用到,针对这些数据,我们可以在系统启动时将它们初始化到一个Application级的变量,然后每隔固定时间进行刷新,这样所有页面就可以直接使用这些资料,而不用每次都重新从数据库捞取数据了,这也就是简单的Cache.

在Java技术中,我们可以使用Listener来实现这一功能。JSP中有提供一个javax.servlet.ServletContextListener的接口,实现该接口的类可以作为一个Application级的监听器,它可以监听应用程序的启动和终止,并分别触发其contextInitialized和contextDestroyed方法,所以,我们实现这两个方法就可以分别在应用程序加载之前Cache数据,并在应用程序终止之前释放资源.
其中可以通过参数ServletContextEvent event的getServletContext方法得到ServletContext,得到ServletContext之后,我们就可以用setAttribute方法往Application变量中写数据了。同样,应用程序终止之前,可以通过removeAttribute方法移除Cache数据,释放资源.

但是我们的数据必须要自动更新才是有效的,我们假设希望Cache数据会每隔5分钟自动更新,当连接请求到来时,判断Cache是否超时,如果超时,则更新Cache,否则,可以直接读取Cache数据。那么我们需要在context变量中添加一个用来记录Cache建立时间的变量,另外为了确保Cache更新中的同步,在context变量中新增另外一个标志Cache是否正在更新的字段.
对Cache的更新,我们使用另外一种监听器:javax.servlet.ServletRequestListener,实现该接口同样需要两个实现两个方法,该监听器可以监听一个请求到来的事件,我们在requestInitialized时来判断Cache是否超时,并做一些更新Cache的操作.
代码如下:web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<listener>
<display-name>application listener</display-name>
<listener-class>
net.moon.listener.ApplicationListener
</listener-class>
</listener>

<listener>
<display-name>request listener</display-name>
<listener-class>
net.moon.listener.RequestListener
</listener-class>
</listener>
</web-app>

实现ServletContextListener的类
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ApplicationListener implements ServletContextListener {

public void contextDestroyed(ServletContextEvent event) {
//销毁共享信息 释放内存
}

public void contextInitialized(ServletContextEvent event) {

//查询数据库获得所要共享的信息

//获得ServletContext实例
ServletContext context = event.getServletContext();

//将查询到的共享信息保存到ServletContext中 context.setAttribute();

//将更新时间加入
context.setAttribute("birthTime", new Date());
context.setAttribute("isRefreshing", false);
}

}

实现ServletRequestListener的类
import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class RequestListener implements ServletRequestListener {

private final static float CACHE_MAX_AGE = 5 * 60 * 1000;

public void requestDestroyed(ServletRequestEvent event) {

}

public void requestInitialized(ServletRequestEvent event) {
ServletContext context = event.getServletContext();
if(!(Boolean)context.getAttribute("isRefreshing")
&& ((new Date()).getTime() - ((Date)context.getAttribute("birthDate")).getTime()) > CACHE_MAX_AGE){
context.setAttribute("isRefreshing", true);

//在这里再次查询数据库,并将ServletContext中的信息更新

context.setAttribute("isRefreshing", false);
}
}
}

这就是使用Listener来实现数据Cache,当然在我们开发中还可以在提前加载一个Servlet时初始化这些信息,也可以实现这个功能.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值