Hibernate缓存和ehcache

缓存的概念

         计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是存储源总的数据的拷贝。缓存的物理介质通常是内存。

 

Hibernate中提供了两个级别的缓存

         Session级别的缓存

         它是属于事务范围的缓存。这一级别的缓存有Hibernate管理的,一般情况下午需进行干预。

         SessionFactory级别的缓存

         它是属于进程范围的缓存

 

启用二级缓存的条件

很少被修改

 

很多系统模块都要用到

 

不是私有的数据,是共享的

 

配置二级缓存

1、  拷贝ehcache-1.5.0.jar到当前工程的lib目录下

2、  开启二级缓存

3、  要指定缓存的供应商

<property name=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</property>

4、  指定使用二级缓存的类

方法一  在使用类的*.hbm.xml配置

选择需要使用二级缓存的持久化类,设置它的二级缓存的兵法访问策略,<class>元素的cache子元素表明Hibernate会缓存对象的简单属性,但不会缓存集合属性,若希望缓存集合属性中的元素,必须在<set>元素中加入<cache>子元素

<class name=”cn.itcast.c3p0.Customer” table=”customers” lazy=”false”>

         <!—配置类级别的二级缓存à

         <cache usage=”read-write”/>

<set name=”orders” table=”orders” inverse=”true” fetch=”select” lazy=”false”>

         <!—配置集合级别的二级缓存à

         <cache usage=”read-write”/>

 

方法二   在hibernate.cfg.xml文件中配置(建议)

<!—指定使用二级缓存的类,放在maping下面à

<!---配置类级别的二级缓存-->

<class-cache class=”cn.itcast.c3p0.Customer” usage=”read-write”/>

<class-cache class=”cn.itcast.c3p0.Order” usage=”read-write”/>

 

<!—配置集合级别的二级缓存à

<collection-cache collection=”cn.itcast.c3p0.Customer.orders” usage=”read-write”/>

<diskStore path=”D:\cache”/>

<cache name=””

maxElementsInMemory=”100”

eternal=”false”

timeToIdleSeconds=”300”

timeToLiveSeconds=”600”

overflowToDisk=”true”

diskPersistent=”false”/>

</ehcache>

 

<diskStore path=”C:\\TEMP”/>:如果内存中的数据已经达到所要求存放的最大值的时候。这个时候,其他的数据将会以文件的形式存放到磁盘上。

 

<defaultCache>设置缓存的默认数据过期策略

 

<cache>设定具体的命名缓存的数据过期策略

每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置过期策略。

 

cache元素的属性

name:设置缓存的名字,它的取值为类的全限定名或类的集合的名字

maxElementsInMemory:设置基于内存的缓存中可存放的对象最大数目

eternal:设置对象是否为永久的,true表示永不过期,此时将忽略

timeToIdleSeconds:设置对象空闲最长时间,以秒为单位,超过这个时间,对象过期。当对象过期是,EHCache会把它从缓存中清空。如果此值为0,表示对象可以无限期地处于空闲状态。

TimeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在缓存中,该属性必须大于或等于timeToIdleSeconds属性值。

OverflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到硬盘的缓存中。

diskPersistent当jvm结束时是否持久化对象true  false默认是false

diskExpiryThreadIntervalSeconds指定专门用于清除过期对象的监听线程的轮询时间。

 

时间: 2024-09-22 14:15:02

Hibernate缓存和ehcache的相关文章

基于 Hibernate缓存的Ehcache让实体对象集合对象缓存

考虑到效率和对数据库的压力,使用缓存或者内存缓存,可以提高反应速度和减轻数据库压力.hibernate中支持的比较多,在hibernate给的文档"提升性能"章节有详细介绍: hibernate支持缓存类型和介绍: 后面三个还支持集群,比较强大. 现在详细介绍Ehcache使用: Ehcache所需要的jar包(配合hibernate使用): 加入配置文件: <ehcache> <!-- Sets the path to the directory where cac

语言教程学堂:hibernate缓存机制详细分析

在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: /** * 此时会发出一条sql,将30个学生全部查询出来 */ List<Student> ls =

mybatis缓存和hibernate缓存的理解问题和区别。类缓存和查询缓存的理解和区别

问题描述 mybatis缓存和hibernate缓存的理解问题和区别.类缓存和查询缓存的理解和区别 Hibernate的一级缓存的目的是为了方便管理实体类的状态(临时状态.持久化状态.游离状态.删除状态).Hibernate的目的二级缓存是为了减少sql语句.那么mybatis的一级缓存和二级缓存的目的是为了什么? Hibernate的二级缓存通常使用ehcache,通常配置的是实体类,所以ehcache里面配置实体类是属于类缓存吗? 类缓存到底在什么地方优化?怎样减少sql语句? 查询缓存到底

缓存之EHCache(转)

一.简介非常简单,而且易用. ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,而且是hibernate 默认的缓存provider.ehcache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.ehcache可以直接使用.也可以和Hibernate对象/关系框架结合使用.还可以做Servlet缓存.Cache 存储方式 :内存或磁盘.官方网站:http://ehcache.sourceforge.net

Java的进程内缓存框架:EhCache (转)

EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 6. 可以通过RMI.可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多缓存管理器实例,以及一个实例的多个缓存区域 9. 提供Hibernate的缓存实现  

【转 :Hibernate 缓存机制】

转自:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html Hibernate 缓存机制   一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据.   二.what(Hibernate缓

Hibernate缓存

Hibernate缓存在工作面试的时候很可能会遇到的问题. 缓存其实就是一块内存空间,充当数据库的内存中的一个临时的容器. 一:hibernate缓存是怎样的?    Hibernate缓存提供了两种缓存:一级缓存和二级缓存. 1 一级缓存又称事务级缓存,Session的缓存.     在Hibernate中一级缓存存是基于Session的生命周期实现的,每一个Session会在内部维护一个数据缓存,她随着Session的创建而创建,销毁而销毁.     一级缓存是必须的,在同一个一级缓存中,每

第十二章 hibernate缓存

1.一级缓存(Session级缓存) 一级缓存很短和session的生命周期一致,因此也叫session级缓存或事务级缓存 那些方法支持一级缓存: *get() *load() *iterate(查询实体对象) 如何管理一级缓存: *session.clear(),session.evict() 如何避免一次性大量的实体数据入库导致内存溢出 方法1:先flush,再clear for(int i = 0; i <1000000; i++){ session.save(user); if(i %

Hibernate缓存同步问题

问题描述 环境: OS : Win XP SP2 Hibernate: 3.5.1伪代码: System.out.println(StringUtils.center("query 查询: " )); Session session = HibernateSessionFactory.getSession(); String hql = "FROM Room T WHERE T.address = ?"; Query query = session.createQu