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時初始化這些信息,也可以實現這個功能.
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 2620
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章