一、hibernate缓存简介
一级缓存(session):内部缓存
事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。
二级缓存(sessionFactory):
缓存被应用范围内的所有事务共享。 这些事务有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时, 缓存也就结束了生命周期,二级缓存存在于应用范围。集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性, 缓存中的数据通常采用对象的松散数据形式,二级缓存也存在与应用范围。
注意:对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,再加上集群范围还有数据同步的问题,所以应当慎用。多种范围的缓存处理过程持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到应用范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询了。
使用二级缓存的原则:
◆数据不会被第三方修改
◆同一数据系统经常引用
◆数据大小在可接受范围之内
◆关键数据或不会被并发更新的数据
二、EhCache简介
EHCache 是一个非常轻量级的缓存实现,是一个纯Java的进程内缓存框架,而且从1.2 之后就支持了集群,是Hibernate中默认的CacheProvider。
具有快速、精干等特点,Ehcache可以直接使用。
也可以和Hibernate对象/关系框架结合使用。可以将对象、数据、jsp、Servlet进行缓存。
Cache 存储方式 :内存或磁盘。
三、配置
1、首先到官网下载ehcache-core.jar、ehcache-web.jar最新版本,然后加入所在工程的lib中
2、在hibernate的相关配置中添加如下:
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
3、需要在映射文件*.hbm.xml中<class name="" table="" > 节点下添加如下:
<!-- 缓存策略 -->
<cache usage="read-write"/>
4、在src根目录下加入ehcache.xml文件,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
< ehcache>
<!-- 数据缓存存放目录 -->
<diskStore path="/jcms_cache_data/ehcache"/>
<!--
页面缓存
三种缓存算法:LRU-最近最少使用、LFU-较少频率使用和FIFO-先进先出。
参数详解:
simplePageCachingFilter 缓存的名称
maxElementsInMemory 缓存中元素的最大数量
maxElementsOnDisk 持久化到硬盘的缓存元素的最大数量
eternal="false" 如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;
overflowToDisk="true" 当缓存中元素数量超过限制时,将这些元素持久化到硬盘,为false时,设置没意义。
timeToIdleSeconds 多长时间不访问缓存,那么就清除该缓存
timeToLiveSeconds 缓存的存活时间
-->
<cache name="SimplePageCachingFilter"
maxElementsInMemory="10000"
maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="5"
timeToLiveSeconds="30"
memoryStoreEvictionPolicy="LFU"/>
<!-- Ehcache 对象、数据缓存用以下配置 -->
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"/>
< /ehcache>
5、web.xml中加入以下配置:
<!-- Ehcache页面缓存配置 -->
<filter>
<filter-name>PageCacheFilter</filter-name>
<filter-class>net.cnki.tpi.cms.util.PageCacheFilter</filter-class>
<!-- 初始化参数为无需缓存的URL,多个以逗号分隔 -->
<init-param>
<param-name>notCacheUrlList</param-name>
<param-value>/jcms/pcons/getUserManager.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PageCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5、写一个Filter,继承SimplePageCachingFilter,如下:
[java]
package net.cnki.tpi.cms.util;
import java.util.Enumeration;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.constructs.blocking.LockTimeoutException;
import net.sf.ehcache.constructs.web.AlreadyCommittedException;
import net.sf.ehcache.constructs.web.AlreadyGzippedException;
import net.sf.ehcache.constructs.web.filter.FilterNonReentrantException;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
import org.apache.log4j.Logger;
public class PageCacheFilter extends SimplePageCachingFilter {
private final static Logger log = Logger.getLogger(PageCacheFilter.class);
private final static String NOT_CACHE_URL_LIST = "notCacheUrlList";
private static String[] notCacheURLs;
private void init() throws CacheException {
String notCacheUrlList = filterConfig.getInitParameter(NOT_CACHE_URL_LIST);
if(!MyStringUtil.isNullOrEmpty(notCacheUrlList)){
notCacheURLs = notCacheUrlList.split(",");
}
}
@Override
protected void doFilter(final HttpServletRequest request,final HttpServletResponse response, final FilterChain chain)throws AlreadyGzippedException, AlreadyCommittedException,FilterNonReentrantException, LockTimeoutException, Exception
{
if (notCacheURLs == null) {
init();
}
String request_url = request.getRequestURI();
boolean flag = false;
if (notCacheURLs != null && notCacheURLs.length > 0) {
for (String notCacheURL : notCacheURLs) {
if (request_url.contains(notCacheURL.trim())) {
flag = true;
break;
}
}
}
//如果请求的url为不需要缓存的,则执行正常页面转向;否则缓存该页面
if (flag) {
chain.doFilter(request, response);
}else{
String query = request.getQueryString();
if (query != null) {
query = "?" + query;
}
log.info("当前请求被缓存:" + request_url + query);
super.doFilter(request, response, chain);
}
}
@SuppressWarnings("unchecked")
private boolean headerContains(final HttpServletRequest request, final String header, final String value) {
logRequestHeaders(request);
final Enumeration accepted = request.getHeaders(header);
while (accepted.hasMoreElements()) {
final String headerValue = (String) accepted.nextElement();
if (headerValue.indexOf(value) != -1) {
return true;
}
}
return false;
}
@Override
protected boolean acceptsGzipEncoding(HttpServletRequest request) {
boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");
boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0");
return acceptsEncoding(request, "gzip") || ie6 || ie7;
}
}
相关推荐
此配置和包,是springMVC4.3.3 +spring4+hibernate5.1.3+二级缓存ehcache(不用可以关闭)+fastjson。 是正常运行的项目里拷出来的,方便大家使用。
hibernate二级缓存 ehcache
Hibernate4二级缓存Ehcache案例,可参考博客:http://blog.csdn.net/coco2d_x2014/article/details/52927638
使用Java工程实现了Hibernate二级缓存(Ehcache),其中还有自己封装的一个jar包实现了简单的分页功能
Hibernate中默认的二级缓存机制ehcache案例,属性ehcache环境搭建,配置问题。
Hibernate EhCache 二级缓存配置
hibernate ehcache.xml 配置详解
ehcache 二级缓存 配置使用的jar包 配置如下: <!-- 启用二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true <!-- 查询的二级缓存配置 --> <property name="hibernate....
hibernate二级缓存相关插件(EHcache)
本人在做项目时用到了Hibernate的二级缓存,使用的是EhCache,结合本人自己的理解总结了如何在java web项目中配合Hibernate使用二级缓存,以提高程序的性能,附带需要的文件,参考的文件,和测试类以及说明。
Hibernate+ehcache二级缓存技术 Hibernate+ehcache二级缓存技术
hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache
ehcache缓存配置详解 个人通过查资料和实践后总结
配置 EhCache 的实例 1、 简介: EhCache缓存插件是Hibernate的另一个项目,Hibernate框架内置了对它 的支持,对于单机应用推荐使用它做为Hibernate的二级缓存。
hibernate4配置ehcache二级缓存,以及相关的jar都在源码中。
Hibernate二级缓存+分页功能
ehcache二级缓存配置文件
Ehcache2缓存区配置详解.pdf
2.4. 使用EhCache配置二级缓存: 2.4.1. 配置准备: 1) 把ehcache-1.2.3.jar加入到当前应用的classpath中。 2) 在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。 <!--配置缓存插件 --> ...
NULL 博文链接:https://dreamoftch.iteye.com/blog/1985366