j2ee静态化也慢慢缓存解决方案

2024-05-05 17:18

本文主要是介绍j2ee静态化也慢慢缓存解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

web caching

 

1.介绍

Ehcache Web 是 EhCache 缓存框架的一个组件,主要用于Java开发Web项目中的一些缓存功能。包括一个单页缓存过滤器:SimplePageCachingFilter;页面压缩(gzip)支持;页面片段缓存等功能。在某些情况下能够很好的提高web应用的性能。

 

2.simplePageCachingFilter

   能够缓存httpresponse的html,json,xml等输出的完整页面或者页面片段的缓存,也支持gzipping的页面缓存。页面片段缓存可以参考SimplePageFragmentCachingFilter类。

 

3.keys 缓存的key值

   缓存的key是依赖的查询url和query查询参数串,比如/admin/SomePage.jsp?id=1234&name=Beagle。不依赖于url的域名和端口号,所以对于绑定多个域名的同一台机器也是有效地。但是如果url加了一些为了跟踪用户行为用的序列生成的id号,则无法使用缓存。在这种情况下你也可以重写calculateKey(javax.servlet.http.HttpServletRequest)这个方法来定义自己缓存的key。

 

4.多线程并发缓存失效问题

   为了避免多线程并发导致cache失效之类的问题,可以通过设置init-param的 blockingTimeoutMillis参数,指定第一个获得锁的线程的超时时间,避免后续请求阻塞。

 

5.gzipping

  浏览器如果支持Accept-Encoding: gzip,则在缓存中直接取出gzip的response结果,如果浏览器不支持,则cache会通过高效的ungzipped之后把结果输出到response上。

 

6.caching headers

  SimpleCachingHeadersPageCachingFilter 这个类能够缓存http请求 headers的ETag, Last-Modified 和Expires字段,支持get请求。这样是为了让浏览器快速获取某个页面是否浏览器缓存失效问题。

 

7.web。xml中可以设置的 init-params
  • cacheName -ehcache.xml 用户设置的filter的cache名称
  • blockingTimeoutMillis - the time, in milliseconds, to wait for the filter chain to return with a response on a cache miss. This is useful to fail fast in the event of an infrastructure failure.
  • varyHeader - set to true to set Vary:Accept-Encoding in the response when doing Gzip. This header is needed to support HTTP proxies however it is off by default.
 8.SimplePageFragmentCacheingFilter

 

跟simplePageCachingFilter差不多,不过不支持gzip,这样才能对多个页面进行合并。

 

9.web.xml的配置

   <web-app xmlns=http://java.sun.com/xml/ns/javaee

 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
version="2.5"><filter>
<filter-name>CachePage1CachingFilter</filter-name>
<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
</filter-class>
<init-param><param-name>suppressStackTrace</param-name><param-value>false</param-value>
</init-param>
<init-param><param-name>cacheName</param-name><param-value>CachePage1CachingFilter</param-value>
</init-param></filter><filter>
<filter-name>SimplePageFragmentCachingFilter</filter-name>    <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter
</filter-class>
<init-param><param-name>suppressStackTrace</param-name><param-value>false</param-value>
</init-param>
<init-param><param-name>cacheName</param-name><param-value>SimplePageFragmentCachingFilter</param-value>
</init-param></filter><filter>
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>    <filter-class>net.sf.ehcache.constructs.web.filter.SimpleCachingHeadersPageCachingFilter
</filter-class>
<init-param><param-name>suppressStackTrace</param-name><param-value>false</param-value>
</init-param>
<init-param><param-name>cacheName</param-name><param-value>CachedPage2Cache</param-value>
</init-param></filter><!-- This is a filter chain. They are executed in the order below.Do not change the order. --><filter-mapping>
<filter-name>CachePage1CachingFilter</filter-name>
<url-pattern>/CachedPage.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher></filter-mapping><filter-mapping>
<filter-name>SimplePageFragmentCachingFilter</filter-name>
<url-pattern>/include/Footer.jsp</url-pattern></filter-mapping><filter-mapping>
<filter-name>SimplePageFragmentCachingFilter</filter-name>
<url-pattern>/fragment/CachedFragment.jsp</url-pattern></filter-mapping><filter-mapping>
<filter-name>SimpleCachingHeadersPageCachingFilter</filter-name>
<url-pattern>/CachedPage2.jsp</url-pattern></filter-mapping>

 

10.ehcache.xml的配置

   <Ehcache xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

 

xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/><defaultCachemaxEntriesLocalHeap="10"eternal="false"timeToIdleSeconds="5"timeToLiveSeconds="10"overflowToDisk="true"/><!-- Page and Page Fragment Caches -->
<cache name="CachePage1CachingFilter"maxEntriesLocalHeap="10"eternal="false"timeToIdleSeconds="10000"timeToLiveSeconds="10000"overflowToDisk="true">
</cache>
<cache name="CachedPage2Cache"maxEntriesLocalHeap="10"eternal="false"timeToLiveSeconds="3600"overflowToDisk="true">
</cache>
<cache name="SimplePageFragmentCachingFilter"maxEntriesLocalHeap="10"eternal="false"timeToIdleSeconds="10000"timeToLiveSeconds="10000"overflowToDisk="true">
</cache>
<cache name="SimpleCachingHeadersTimeoutPageCachingFilter"maxEntriesLocalHeap="10"eternal="false"timeToIdleSeconds="10000"timeToLiveSeconds="10000"overflowToDisk="true">
</cache>
</ehcache>

 

11.caching filter的异常

FilterNonReentrantException 当同一个线程再次重入caching filter处理时抛出异常,因为当第一个请求还未block时,同一个线程再次进入该filter就会block

ResponseHeadersNotModifiableException类似FilterNonReentrantException 

AlreadyGzippedException 如果已经对一个页面进行gzip处理,再次gzip时就抛出该异常

ResponseHeadersNotModifiableException如果对页面进行gzip处理,那么需要重新设置setheader的值,如果在设置过程中出错了,则抛出该异常。

 

参考:http://www.ehcache.org/documentation/user-guide/web-caching

 

对源码实现欢迎参考 http://zhwj184.iteye.com/blog/1545157

这篇关于j2ee静态化也慢慢缓存解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962229

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操