`
favor
  • 浏览: 143984 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

listener使用之-实现Cache

    博客分类:
  • java
阅读更多
                     
Listener使用

    进行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时初始化这些信息,也可以实现这个功能.
分享到:
评论

相关推荐

    guava-cache.rar

    Guava Cache支持基于时间(如上面示例中的`expireAfterWrite`)和基于访问频率(`expireAfterAccess`)的过期策略,还可以通过`weakKeys`或`weakValues`实现弱引用,让JVM在内存紧张时自动清除不再使用的缓存项。...

    spring-cache(通过key值更新缓存)

    7. **事件监听**:Spring Cache还支持缓存事件监听,通过实现`ApplicationListener&lt;CacheEvictedEvent&gt;`等接口,可以在缓存操作后执行相应的逻辑。 8. **异常处理**:当方法抛出异常时,Spring Cache可以配置是否将...

    第七章 企业项目开发--本地缓存guava cache1

    总结,Guava Cache是Java开发中实现本地缓存的一个强大工具,它的灵活性和丰富的特性使得缓存管理变得高效且易于维护。在实际项目中,合理地利用Guava Cache,可以显著提升系统性能,减少不必要的I/O操作。同时,...

    Web应用与开发作业

    response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache"); (3)并不是所有的浏览器都能完全支持上面的3个响应头,因此最好是同时使用上面的3个响应头。 2、Filter的理解和应用 ...

    volley存储数据

    - `Cache-Only`:只从缓存获取数据,不发送网络请求。 - `Network-Only`:仅从网络获取数据,不使用缓存。 - `Default`:优先尝试缓存,如果没有缓存或缓存过期,则发送网络请求。 - `No Cache`:不使用缓存,每次...

    Android开发HTTP使用okgo请求数据的实现demo

    .setCacheMode(CacheMode.NO_CACHE); // 默认不使用缓存,可根据需求选择缓存模式 } } ``` 接下来,我们将自定义封装一个通用的请求方法。创建一个网络请求工具类`NetUtil`,包含一个静态方法`sendRequest`,该...

    AppUpdate-一个简单、轻量、可随意定制 的Android版本更新库 .zip

    框架内部支持中/英文(其他语言只需要在对应的string....如果需要实现自己一套下载过程,只需要继承BaseHttpDownloadManager 并使用listener更新进度public class MyDownload extends BaseHttpDownloadManager {}

    volley二次开发

    - 实现自定义 NetworkInterface:用于处理实际的网络交互,可以使用 OkHttp 或其他网络库替换默认的 HttpClient。 - 自定义 ResponseListener 和 ErrorListener:为不同类型的请求提供定制化的回调。 - 扩展 ...

    spring-context-support-4.2.2.RELEASE.jar 的jar包

    3. **消息队列支持**: 对于JMS的集成,`spring-context-support`提供了MessageListenerContainer和MessageProducer,允许开发者创建消费者和生产者,从而实现基于消息的异步通信。这对于构建可扩展和解耦的系统非常...

    springboot学习思维笔记.xmind

    定义事件监听器,实现ApplicationListener 使用容器发布事件 Spring高级话题 Spring Aware BeanNameAware BeanFactoryAware ApplicationContextAware MessageSourceAware ...

    ehcache学习文档

    对于独立的应用程序,可以直接在代码中初始化 `CacheManager` 和 `Cache` 对象,并使用它们进行缓存操作。这种方式适合简单的测试场景或不需要高度定制化的缓存配置。 ```java import net.sf.ehcache.Cache; import...

    Volley jar包和源代码

    - 默认实现使用Handler和Looper,确保响应在合适的线程中处理。 7. **源代码分析**: - 深入研究Volley源代码,可以了解其内部工作流程,比如如何处理并发请求、如何实现智能缓存策略、错误重试机制等。 - 对...

    安卓网络框架--volley的简单使用

    你可以通过设置`Cache-Control`和`ETag`头信息来自定义缓存策略。此外,Volley还支持自定义缓存实现。 为了提高性能,Volley会复用网络连接并管理线程池。通过`NetworkDispatcher`,Volley会异步处理请求,确保UI...

    Volley.jar及源码

    - **Cache**接口和其实现(如DiskBasedCache)如何实现本地缓存策略。 - **ErrorListener**和**ResponseListener**接口是如何处理请求的异常和成功响应的。 总的来说,"Volley.jar及源码"提供了了解和使用Volley...

    Apress.Pro.JPA.2.2nd.Edition.Oct.2013

    7. **缓存机制**:讲解JPA的缓存层次结构,包括一级缓存(First-Level Cache)和二级缓存(Second-Level Cache),以及如何配置和优化缓存性能。 8. **转换和事件监听**:探讨实体转换(Entity Transformer)和实体...

    idea+maven+kaptcha验证码实现

    response.setHeader("Cache-Control", "no-store"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); BufferedImage image = producer.createText(); ImageIO.write(image, ...

    Android Volley框架使用实例

    - **自定义缓存策略**:可以通过实现 Cache 接口来自定义缓存策略,满足特定需求。 - **自定义网络客户端**:Volley 默认使用 HttpURLConnection,也可以替换为 HttpClient 或其他网络库。 - **优先级控制**:...

    TongWeb6.0应用开发手册.pdf

    - 可以通过注解`@Interceptor`定义拦截器类,并使用`@AroundInvoke`或`@AroundTimeout`注解指定拦截点。 ##### 3.4 依赖注入 - **引用EJB**: - 通过注解`@EJB`将EJB Bean实例注入到其他Bean或组件中。 - 这种...

Global site tag (gtag.js) - Google Analytics