- 浏览: 253994 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
B/S结构下套打票据实现 - Lodop打印组件 -
iTarget:
原原文::http://blog.csdn.net/steve ...
加减乘除的问题 - BigDecimal -
iTarget:
原文:http://blog.csdn.net/gqm1982 ...
加减乘除的问题 - BigDecimal -
iTarget:
在Java中,要想实现精确计算,解决方案是使用BigDecim ...
加减乘除的问题 - BigDecimal -
叶寒_:
...
JSP简单标签
节 13.01 缓存类型
1、 事务范围缓存:添加到当前工作单元,是一个数据库事务,甚至是一个对话。只有在工作单元运行时才生效。每一个工作单元都有自己的高速缓存,这个高速缓存中的数据不会被并发访问。
2、 过程范围缓存:在许多工作单元或者事务之间共享。过程范围缓存的数据被并发运行的线程访问,隐含着事务隔离性。
3、 集群范围缓存:在同一台机器 多个进程之间或者一个集群中的多台机器上共享。
节 13.02 缓存适用条件
1、 很少改变的数据。
2、 不重要的数据。
3、 应用程序固有的而非共享的数据。
比如像邮政编码、参考地址、办公地点等不经常修改的数据可以尝试使用二级缓存。
节 13.03 Hibernate缓存架构
Hibernate存在两个级别的缓存:
1、 一级缓存:一级缓存是持久化上下文高速缓存,一个Hibernate的Session的寿命相当于单个请求(用一个数据库事务实现)或者单个对话。这是一个强制的一级缓存,它保证对象的范围和数据库同一性。
注:StatelessSession对象例外,因为其没有持久化上下文。
2、 二级缓存:Hibernate的二级缓存是可插拔并且可以使用到过程或者集群中。从特定的SessionFactory开始的所有上下文共享同一个二级高速缓存。持久化实例以序列化的形式保存到二级缓存中。
使用高速缓存涉及一下问题:
1、 二级高速缓存是否被启用。
2、 Hibernate的并发策略。
3、 缓存过期策略。
4、 缓存的物理格式。
注:高速缓存通常主要用来读取的类有用,如果有更新比读取更经常的数据,就不要启动二级缓存。
节 13.04 二级缓存搭建
Hibernate二级高速缓存创建分2步:
1、 决定并发策略。
2、 利用缓存提供程序配置缓存过期和物理缓存属性。
(a) 并发策略
1、 事务transactional 主要用于读取数据的策略,维护可重复读取repeatable read隔离。很少用于更新操作。
2、 读/写read-write 利用时间戳维护读取递交read committed隔离。只能用于非群集环境中,给主要用于读取的数据中使用的策略。
3、 非严格读/写nonstrict-read-write 不提供缓存和数据库之间的一致性保证。如果数据几乎不变,而且废弃的数据不是关键可以使用该策略。
4、 只读 read-only 适用于从不改变的数据。
(b) 启动二级缓存
<property name="hibernate.cache.use_query_cache">true</property>
(c) EHCache缓存
(i) Hibernate配置文件
EHCache缓存是Hibernate包中包含的二级缓存工具包。
<!—启用EHCache缓存 --> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property>
(ii) Ehcache配置文件
<?xml version='1.0' encoding='UTF-8'?> <ehcache> <!-- diskStore:代表当二级缓存对象数据在内存中溢出,如果需要写入文件系统时的文件目录。 defaultCache:默认的calss缓存配置,如果某个对象没有其专有的配置时,ehcache一律启用默认配置 maxElementInMemory:对象在内存中可存放的最大数量。 eternal:表示对象永不过期,如果选true则5,6两项无效。 timeToIdleSeconds:对象的空闲状态过期时间,单位为秒,0为可以无限制空闲。 timeToLiveSeconds:对象存在的最长时间,单位为秒(注意,如果该项比5项要小,则第5项无意义),0为永不过期。 overflowToDisk:当对象在内存中的数量超过maxElementInMemory值时,如果该项为true,则ehcahe会把对象数据写入diskStore项指定的目录。 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> <cache name="cache1" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" /> <!--Hibernate使用缓存--> <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true" timeToIdleSeconds="1800" timeToLiveSeconds="0" overflowToDisk="true"/> <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="1800" timeToLiveSeconds="0" overflowToDisk="true"/> </ehcache>
注:Hibernate缓存使用原因:
当Hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢? Hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面UpdateTimestampsCache所指定的缓存配置里面。当通过Hibernate更新的时候,Hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当Hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。当然,如果没有这两个配置,则ehcache将为查询缓存启用默认配置。
(iii) 使用EHCache缓存
Class缓存的作用主要是在内存中保存某个具体对象,当用户第一次通过get、iterator方式取出对象时,系统会先从class缓存中去找,如果没有再通过sql语句去数据库中查找相关记录,并将查询到的对象放入内存中。
1、 对象使用缓存
<cache usage="read-write" />
read-only:只对缓存中的对象进行读操作。
read-write:当对象被update时,缓存中和数据库中一同被修改(缓存不支持事务回滚)。
2、 关联对象使用缓存
<set name="creditCards" inverse="true"> <cache usage="read-write"/> <key><column name="BANK_ACCOUNT_ID" length="100" /></key> <one-to-many class="entity.CreditCard" /> </set>
1、只对one-to-many有效,而且仅仅缓存的是关联对象的id集合,如果需要实现完全缓存,则需要对关联的对象也配置成使用二级缓存。
2、集合缓存是独立的,不受关联对象添加、删除的影响,如果要修改集合内容,必须对这个集合本身进行修改,例如:codelist.getChildren().add()。
3、如何使用查询缓存,查询目的是为了将通过list()方法的查询结果存入缓存中,并实现对语句的缓存,如果下次用户在使用这条语句进行查询时,将直接从缓存中获取对象数据。这里要注意的是,查询缓存必须配合class缓存使用,如果只启用查询缓存,不对查询对象启用二级缓存,则会大大降低查询效率。
因为,当第一次通过启用查询缓存的session进行语句查询时,系统只执行一次数据库查询将所有的记录取出,并将对象存入class缓存,语句及id集合存入查询缓存;而当用户第二次查询该语句时,系统将先执行去查询缓存中查找,取出所有符合条件的id集合,如果这时候该对象的class缓存没启用或在class缓存中已过期,系统将根据id,一个个去数据库load,实际上是进行了1+N次查询。
实际上,在我们系统中,并不是对所有对象都要进行二级缓存,而spring框架中提供的hibernate方法,虽然有getHibernateTemplate().setCacheQueries(),但该方法影响的是全局的配置,一旦启用,将会对不需要缓存的查询造成不良影响。
public List findByCachedQuery(final String hql) { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query queryObject = session.createQuery(hql); queryObject.setCacheable(true); if (getHibernateTemplate().getQueryCacheRegion() != null) { queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion()); } return queryObject.list(); } }, true); }
这样,将只在session范围内启用查询缓存,一旦该session结束了,那么查询缓存也将回复默认配置。注意:使用时只支持hql。
4、在使用二级缓存时,注意,所有对数据库的修改都必须走hibernate,如果从其他系统来或使用sql语句来修改数据库相关记录,那么将对二级缓存的数据不会造成影响,换句话说,缓存中的对象数据将和数据库中的不一致。
发表评论
-
Hibernate QBC语言
2009-03-27 15:14 4866节 8.01 基本查询 以 ... -
Hibernate HQL语言
2009-03-26 16:01 8422HQL查询 节 10.01 单表HQL查询 FROM C ... -
Hibernate 查询策略
2009-03-26 13:33 3497第 I 条 -
HIbernate 大批量数据处理
2009-03-25 17:11 2858节 1.01 -
Hibernate乐观锁控制
2009-03-24 17:00 11211、 -
Hibernate控制事务并发访问
2009-03-24 16:28 1603(a) -
Hibernate的Java SE事务
2009-03-24 15:26 11051、在Hibernate的配置文件中添加以下内容: < ... -
Hibernate 一对一延迟加载
2009-03-24 14:38 1746当主外键为同一字段时可以使用一对一的延迟加载 ... -
Hibernate的继承策略
2009-03-23 17:15 1494... -
Hibernate的集合映射
2009-03-23 17:13 1085... -
Hibernate持久化上下文
2009-03-23 17:10 1268持久化上下文作用 : -
Hibernate托管对象
2009-03-23 16:41 30811、 -
Hibernate 一对多关联
2007-08-14 14:44 1178java 代码 CREATE TABLE PERS ... -
HibernateSessionFactory 工具类
2007-07-31 17:37 6913java 代码 public class ... -
Hibernate 多对多关联
2007-07-31 17:36 1491xml 代码 CREATE TABLE GROUP ... -
Hibernate 一对一关联
2007-07-31 17:34 1129xml 代码 CREATE TABLE CUST ... -
Hibernate 一对一关联 (多对一的曲线实现)
2007-07-31 17:32 1619xml 代码 CREATE TABLE AUTHO ... -
Hibernate 多对一关联
2007-07-31 17:30 1254xml 代码 CREATE TABLE CUST ...
相关推荐
### 深入理解Hibernate缓存 #### 一、Hibernate缓存概述 Hibernate作为一款流行的Java持久层框架,为开发者提供了高效且灵活的数据访问能力。其中,缓存机制是Hibernate性能优化的重要组成部分之一。理解Hibernate...
**Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...
Hibernate缓存.docHibernate缓存.doc
Java Hibernate缓存深入详解
### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...
**标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
关于hibernate缓存的一个ppt课件,60+幻灯片,有需要的可以看一下
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
**Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...
本文将深入探讨Hibernate缓存的原理、类型及其对性能优化的影响。 ### Hibernate缓存原理 Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。
**标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...
【Hibernate缓存管理】是数据库持久化框架Hibernate中优化性能的关键技术。缓存的主要目的是减少对数据库的直接访问,提高应用程序的运行效率。缓存的数据是数据库中数据的副本,存在于内存或硬盘中,便于快速读取。...
这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...
【Hibernate缓存详解】 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是提升系统性能的关键所在。本篇将深入探讨Hibernate的缓存机制,包括一级缓存和二级...