使用Listener实现Cache
2007-11-06 17:11
344 查看
进行Web开发时,常常会遇到一些数据需要经常用到,比如客户列表这类,更新频率较小,但是各个页面频繁用到,针对这些数据,我们可以在系统启动时将它们初始化到一个Application级的变量,然后每隔固定时间进行刷新,这样所有页面就可以直接使用这些资料,而不用每次都重新从数据库捞取数据了,这也就是简单的Cache。
在Java技术中,我们可以使用Listener来实现这一功能。JSP中有提供一个javax.servlet.ServletContextListener的接口,实现该接口的类可以作为一个Application级的监听器,它可以监听应用程序的启动和终止,并分别触发其contextInitialized和contextDestroyed方法,所以,我们实现这两个方法就可以分别在应用程序加载之前Cache数据,并在应用程序终止之前释放资源。 其中可以通过参数ServletContextEvent event的getServletContext方法得到ServletContext,得到ServletContext之后,我们就可以用setAttribute方法往Application变量中写数据了。同样,应用程序终止之前,可以通过removeAttribute方法移除Cache数据,释放资源。
在web.xml中配置监听器,如下:
<listener>
<display-name>application listener</display-name>
<listener-class>net.moon.listener.ApplicationListener</listener-class>
</listener>
这样可以实现了数据的cache,但是我们的数据必须要自动更新才是有效的,我们假设希望Cache数据会每隔5分钟自动更新,当然,我们的逻辑是这样的:当连接请求到来时,判断Cache是否超时,如果超时,则更新Cache,否则,可以直接读取Cache数据。那么我们需要在context变量中添加一个用来记录Cache建立时间的变量,另外为了确保Cache更新中的同步,在context变量中新增另外一个标志Cache是否正在更新的字段,修改后的ApplicationListener代码如下: 对Cache的更新,我们使用另外一种监听器:javax.servlet.ServletRequestListener,实现该接口同样需要两个实现两个方法,该监听器可以监听一个请求到来的事件,同样,我们在initial时来判断Cache是否超时,并更新Cache,代码如下:
同样在web.xml中配置该监听器,代码如下:
<listener>
<display-name>request listener</display-name>
<listener-class>net.moon.listener.RequestListener</listener-class>
</listener>
package net.moon.listener;
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 sre) ...{
}
public void requestInitialized(ServletRequestEvent sre) ...{
ServletContext context = sre.getServletContext();
if(!(Boolean)context.getAttribute("isRefreshing")
&& ((new Date()).getTime() - ((Date)context.getAttribute("birthDate")).getTime()) > CACHE_MAX_AGE)...{
context.setAttribute("isRefreshing", true);
//update the cache date here
context.setAttribute("isRefreshing", false);
}
}
}
package net.moon.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Date;
public class ApplicationListener implements ServletContextListener ......{
public void contextDestroyed(ServletContextEvent event) ......{
//destroy resource when this application going down
}
public void contextInitialized(ServletContextEvent event) ......{
//initial resource and data when start this application
ServletContext context = event.getServletContext();
//set the birth time of the cache
context.setAttribute("birthTime", new Date());
context.setAttribute("isRefreshing", false);
}
}
package net.moon.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationListener implements ServletContextListener ...{
public void contextDestroyed(ServletContextEvent event) ...{
//destroy resource when this application going down
}
public void contextInitialized(ServletContextEvent event) ...{
//initial resource and data when start this application
ServletContext context = event.getServletContext();
}
}
在Java技术中,我们可以使用Listener来实现这一功能。JSP中有提供一个javax.servlet.ServletContextListener的接口,实现该接口的类可以作为一个Application级的监听器,它可以监听应用程序的启动和终止,并分别触发其contextInitialized和contextDestroyed方法,所以,我们实现这两个方法就可以分别在应用程序加载之前Cache数据,并在应用程序终止之前释放资源。 其中可以通过参数ServletContextEvent event的getServletContext方法得到ServletContext,得到ServletContext之后,我们就可以用setAttribute方法往Application变量中写数据了。同样,应用程序终止之前,可以通过removeAttribute方法移除Cache数据,释放资源。
在web.xml中配置监听器,如下:
<listener>
<display-name>application listener</display-name>
<listener-class>net.moon.listener.ApplicationListener</listener-class>
</listener>
这样可以实现了数据的cache,但是我们的数据必须要自动更新才是有效的,我们假设希望Cache数据会每隔5分钟自动更新,当然,我们的逻辑是这样的:当连接请求到来时,判断Cache是否超时,如果超时,则更新Cache,否则,可以直接读取Cache数据。那么我们需要在context变量中添加一个用来记录Cache建立时间的变量,另外为了确保Cache更新中的同步,在context变量中新增另外一个标志Cache是否正在更新的字段,修改后的ApplicationListener代码如下: 对Cache的更新,我们使用另外一种监听器:javax.servlet.ServletRequestListener,实现该接口同样需要两个实现两个方法,该监听器可以监听一个请求到来的事件,同样,我们在initial时来判断Cache是否超时,并更新Cache,代码如下:
同样在web.xml中配置该监听器,代码如下:
<listener>
<display-name>request listener</display-name>
<listener-class>net.moon.listener.RequestListener</listener-class>
</listener>
package net.moon.listener;
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 sre) ...{
}
public void requestInitialized(ServletRequestEvent sre) ...{
ServletContext context = sre.getServletContext();
if(!(Boolean)context.getAttribute("isRefreshing")
&& ((new Date()).getTime() - ((Date)context.getAttribute("birthDate")).getTime()) > CACHE_MAX_AGE)...{
context.setAttribute("isRefreshing", true);
//update the cache date here
context.setAttribute("isRefreshing", false);
}
}
}
package net.moon.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Date;
public class ApplicationListener implements ServletContextListener ......{
public void contextDestroyed(ServletContextEvent event) ......{
//destroy resource when this application going down
}
public void contextInitialized(ServletContextEvent event) ......{
//initial resource and data when start this application
ServletContext context = event.getServletContext();
//set the birth time of the cache
context.setAttribute("birthTime", new Date());
context.setAttribute("isRefreshing", false);
}
}
package net.moon.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationListener implements ServletContextListener ...{
public void contextDestroyed(ServletContextEvent event) ...{
//destroy resource when this application going down
}
public void contextInitialized(ServletContextEvent event) ...{
//initial resource and data when start this application
ServletContext context = event.getServletContext();
}
}
相关文章推荐
- 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener
- 使用hashmap实现简单内存cache
- 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener
- 使用ASIHTTPRequest和ASIDownloadCache实现本地缓存
- 弹出输入法布局向上移动(使用OnLayoutChangeListener实现)
- leetcode LRU Cache(高级缓存的最近最少使用算法实现)
- 监听手机wifi状态 实现接口WifiStateListener 即可使用
- @Cacheable注解在spring3中的使用-实现缓存
- 使用ServletContextListener实现优雅的系统初始化
- 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener
- 在 Spring 3.1 中使用 @Cacheable 实现缓存
- 秒杀---使用乐观锁实现或cache实现
- 使用HttpListener实现简单Web服务器
- Solr查询中涉及到的Cache使用及相关的实现【转】
- 使用ServletContextListener和HttpSessionListener两种监听器实现记录当前网站在线人数
- Nginx使用Proxy_cache实现服务器端静态文件缓存
- 使用自定义的BaseAdapter实现 onitemclickListener
- (转)使用HttpListener实现简单Web服务器
- 使用ServletContextListener实现优雅的系统初始化
- 使用C++实现一个LRU cache