- 浏览: 1532868 次
- 性别:
- 来自: 厦门
-
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
Hibernate 的一级缓存
是由 Session 提供的,因此它只存在于 Session 的生命周期中,当程序调用 save(),update(),saveOrUpdate() 等方法,及调用查询接口 list,filter,iterate 时,如 Session 缓存中不存在相应的对象, Hibernate 会把该对象加入到一级缓存中,当 Session 关闭时,该 Session 所管理的一级缓存也会立即被清除。
注意 :Hibernate 的一级缓存是 Session 所内置的,不能被卸载,也不能进行任何配置
一级缓存采用的是 key-value 的 Map 方式来实现的,在缓存实体对象时,对象的主关键字 ID 是 Map 的 key ,实体对象就是对应的 value 。所以说,一级缓存是以实体对象为单位进行存储的,在访问时使用的是关键字 ID 。虽然, Hibernate 对一级缓存使用的是自动维护的功能,没有提供任何配置功能,但是可以通过 Session 中提供的方法来对一级缓存的管理进行手工干预。
get
方法获得持久化对象时,首先查找
Session
缓存
(
一级缓存
)
是否有该对象,如果有,则获得该对象;如果没有,就会访问数据库,如果数据库中找不到数据,则返回
null
。
load
方法也是获得数据,但不同的地方是
load
方法已经假定数据库中一定存在该数据,如果在数据库中找不到该数据,则会抛出一个
org.hibernate.ObjectNotFoundException
异常。
load
方法获得对象的过程是:
load
方法首先在
Session
缓存中查找对象,如果找不到则查找
SessionFactory
缓存
(
二级缓存
),
如果再找不到则访问数据库。值得注意的是,
load
方法是假定数据库中一定有该数据,所以使用代理来延迟加载对象,只有在程序中使用了该对象的属性
(
非主键属性
)
时,
Hibernate
才会进入
load
方法的获得对象过程。所以说,如果数据库中不存在该记录,异常是在程序访问该对象属性时抛出的,而不是在创建这个对象时就抛出。
Hibernate 中迭代( Iterate )查询实体对象 实现 à 1 、查询出我们需要的数据的所有 ID ( 1 条语句)。 2 、根据每个 ID 查询出每个对象( N 条语句)。
两次迭代( Iterate )查询实体对象 à 第二次迭代会发出查询 ID 的语句,然后 Hibernate 会查看缓存中是否有这些 ID ,如果有就不会再发 SQL 语句。
Hibernate 中迭代( Iterate )查询普通属性 实现 à 直接根据 ID 满足的条件,查询出所有的对象的属性(即属性集合)。
两次迭代( Iterate )查询普通属性 à 两次迭代都会根据 ID 满足的条件,查询出所有的对象的属性(即属性集合)。即不会缓存。
总结: Hibernate 的一级缓存只会对实体对像的查询进行缓存,不会对对象的普通属性进行缓存。
大批量的数据添加 à Hibernate 中添加很大量的数据是,默认会把所有添加的对象都缓存起来,这样有可能导致缓存的溢出,处理这种问题时可以确定多少条记录后显示的调用 flush ,并清理缓存。甚至直接使用 JDBC ,如果仍不能满足需求,可以使用数据库的工具,比如: Oracle SQL Loader
通过 Hibernate 的实现:
for(int i=0; i<10000000;i++){ Student student=new Student(); student.setName(“qq”+i); session.save(student); // 每 100 条更新一次 If(i%100==0){ session.flush() // 清理缓存 session.clear(); } } session.getTransaction().commit();
Hibernate 的二级缓存
Hibernate 的二级缓存也称为进程级的缓存或是 sessionFactory 级的缓存,二级缓存可以被所有的 session 共享。二级缓存的生命周期和 sessionFactory 的生命周期是一样的,并且可以通过 sessionFactory 管理二级缓存。二级缓存是缓存实体对象的。缓存可以简单的看成一个 Map ,通过 key 在缓存里面找 value 。 无论 list , load 还是 iterate ,只要读出一个对象,都会填充缓存。但是 list 不会使用缓存 ,而 iterate 会先取数据库 select id 出来,然后一个 id 一个 id 的 load ,如果在缓存里面有,就从缓存取,没有的话就去数据库 load 。有说法说大型查询用 list 会把整个结果集装入内存,很慢,而 iterate 只 select id 比较好,但是大型查询总是要分页查的,谁也不会真的把整个结果集装进来,假如一页 20 条的话, iterate 共需要执行 21 条语句, list 虽然选择若干字段,比 iterate 第一条 select id 语句慢一些,但只有一条语句,不装入整个结果集 hibernate 还会根据数据库方言做优化,比如使用 mysql 的 limit ,整体看来应该还是 list 快。
二级缓存的实现 (EHCache) à 1 、在 Hibernate 包中的 etc 文件夹下拷贝 ehcache.xml 到 src 下。这个文件的配置可以参考文件中的注释。 2 、在 hibernate.cfg.xml 文件中加入缓存的提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>3 、启动二级缓存,
<property name="hibernate.cache.use_second_level_cache">true</property>4 、指定哪些实体需要使用二级缓存 à 可以在映射文件中采用 <cache> 标签指定(这个标签必须在 ID 标签之前)或者这 hibernate.cfg.xml 文件中统一指定
<class-cache class="com.bjpowernode.hibernate.Student" usage="read-only"/>
缓存使用的策略,通常采用 read-only (缓存在内存中是只读的不会改变)和 read-write (可读可写的)
二级缓存涉及到的一些情况:
* 开启二级缓存,在两个 session 中发 load (或 get )语句,第一个事务提交时肯定会发一条 SQL 语句,但是第二个 session 中不会发出 SQL 语句,因为不同的 session 会共享二级缓存中的数据。
*sessionFactory 管理二级缓存:
sessionFactory.evict(Cat.class, catId); // 清除指定ID 的实体 sessionFactory.evict(Cat.class); // 清除所有实体 sessionFactory.evictCollection("Cat.kittens", catId); // 清除一个特定实// 体的集合 sessionFactory.evictCollection("Cat.kittens"); // 清除所有实体的集合
* 一级缓存和二级缓存的交互 à
可以通过 session.setCacheMode(CacheMode.IGNORE); 禁止将一级缓存中的数据放到二级缓存之中。如果另外一个session 进行同样的查询会发出SQL 语句。首先一级缓存失效,二级缓存中有没有放入数据,因此会发第二条语句。
例如:如果没有开启二级缓存,进行大批量更新时,通过没更新固定次数后显示调用flush() 和清除一级缓存,可以防止缓存溢出,但是开了二级缓存后,虽然通过以上步骤清除了一级缓存中的数据,但二级缓存中也放了一份数据,这样是无法避免内存溢出的。所以要通过 session.setCacheMode(CacheMode.IGNORE); 禁止将一级缓存中的数据放到二级缓存之中。
Hibernate 的查询缓存
* 缓存的对象 à 1 、普通属性的结果集2 、查询实体对象时会缓存实体对象的ID
* 缓存的声明周期 à 当管理的表发生修改时,查询缓存的生命周期结束。
* 查询缓存的配置 à 在hibernate.cfg.xml 文件中添加
<property name="hibernate.cache.use_query_cache">true</property>
开启查询缓存,默认为false
在程序中手动的启用 à query.setCacheable(true)
* 查询缓存的一些使用情况:1 、开启查询缓存,关闭二级缓存,采用了query.list() 查询普通的属性,无论在一个session 还是不同的session 中进行两次查询查询都只发出一条SQL 语句。查询缓存和session 的生命周期没有关系2 、开启查询缓存,关闭二级缓存,两个session 中发query.iterate() 查询,第二个session 会发出查询语句,query.iterate() 查询普通属性它不会使用查询缓存, 查询缓存只对query.list() 起作用 。3 、 开启查询缓存,关闭二级缓存,采用query.list() 查询实体,两个session 中发query.list() 查询,第二个session 会发出N 条SQL 语句(这N 条语句是根据ID 进行查询实体),因为前面说过,查询实体对象时查询缓存会缓存实体对象的id ,第二次执行query.list(), 将查询缓存中的id 依次取出,分别到一级缓存和二级缓存中查询相应的实体对象,如果存在就使用缓存中的实体对象,否则根据id 发出查询学生的语句。如果开启二级缓存就不会发出N+1 条语句了 。
* 总结: 查询缓存通常会和二级缓存一起使用
发表评论
-
Hibernate延迟加载(转)
2014-05-04 15:54 770转自:http://cenjun615.blog.1 ... -
hibernate使用@subselect映射数据库视图
2013-12-21 21:15 3362文档引用:http://software-develope ... -
Hibernate annotation 自定义类型 userType
2013-04-01 17:26 1676第一步:添加自定义类: package com.a.en ... -
c3p0配置
2013-03-11 15:44 990<!--注册数据源 --> <bea ... -
hibernate之查询(设置查询提示) (转)
2012-02-03 15:36 1174转自:http://blog.csdn.net/f ... -
如何在spring配置多个Hibernate数据源链接(转)
2012-02-02 15:47 1204一、首先配置hibernate数据源: <?xm ... -
UserType 的 MapType,ListType
2011-12-07 14:42 1271import java.io.Serializable; i ... -
在Hibernate显式使用索引
2011-02-25 19:41 1349http://www.znetdevelopment.com/ ... -
Hibernate中多对多关系映射、保存、查询
2009-10-13 20:13 14220首先是一些基础模型类的建立: import java. ... -
Hibernate HQL 语法大全 查询技巧(2)
2009-09-25 19:10 180211.子查询 ... -
Hibernate HQL 语法大全 查询技巧(1)
2009-09-25 19:10 5000HQL: Hibernate查询语言 ... -
Join用法,HQL的方法,Hibernate中的fetch
2009-09-25 18:47 1785Join用法: 主要有Inner J ... -
xdoclet 2
2009-04-24 10:42 1486XDoclet 2 all XDoclet -&g ... -
hibernate 随机 查询
2009-04-03 21:36 2747/** * 随机取出N条记录 * * @p ... -
XDoclet - discriminator标签
2009-03-14 23:49 2399http://blog.csdn.net/chenjyuj/a ... -
Hibernate UserType 使用xdoclet映射数据库问题
2008-10-18 09:49 1150http://www.hibernate.org/282.ht ... -
Hibernate
2008-08-26 10:42 1146http://www.openfans.net/viewArt ... -
Hibernate 一对一
2008-08-26 10:14 1398//ClassA: import java.io.Seria ...
相关推荐
**hibernate缓存策略详解** Hibernate作为Java领域中广泛使用的ORM框架,其在处理大量数据时,为了提高性能和减少数据库的访问压力,引入了缓存机制。本文将深入探讨Hibernate的缓存策略,包括一级缓存、二级缓存...
Hibernate缓存原理及调优策略 Hibernate缓存原理调优策略
### Hibernate的缓存策略 #### 一、缓存的基本概念 缓存技术是现代软件架构设计中的重要组成部分,尤其在数据库交互频繁的应用场景下尤为重要。简单来说,缓存是一种存储技术,位于应用程序与物理数据之间,目的是...
### Hibernate缓存策略详解 #### 一、理解Hibernate缓存 ##### 1.1 缓存概念 在软件开发领域,缓存技术是一项重要的优化手段,它可以显著提高应用程序的性能和响应速度。Hibernate作为一种持久层框架,其核心功能...
### 深入理解Hibernate缓存 #### 一、Hibernate缓存概述 Hibernate作为一款流行的Java持久层框架,为开发者提供了高效且灵活的数据访问能力。其中,缓存机制是Hibernate性能优化的重要组成部分之一。理解Hibernate...
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...
**Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...
Hibernate 缓存策略是优化应用程序性能的关键组成部分,尤其是在频繁访问数据库的情况下。缓存可以减少对物理数据库的直接访问,提高响应速度。本文将详细介绍Hibernate的一级缓存和二级缓存。 一级缓存,也称为...
### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...
综上所述,Hibernate缓存机制是提升应用性能的重要手段,通过合理配置缓存策略、优化查询方式、管理数据库连接以及实施有效的监控和调优措施,可以显著提高Hibernate应用的运行效率和用户体验。然而,缓存的使用并非...
**Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。
**标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象...在实际项目中,需要根据业务需求和场景选择合适的缓存策略和事务处理方式,以达到最佳的开发效果。
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...
这包括设置缓存策略(读/写、非严格读/写、只读等)、指定缓存区域以及选择缓存提供商。 5. **缓存同步**:为了确保数据一致性,Hibernate提供了一些机制来同步缓存与数据库,如使用版本号或时间戳进行脏检查。 6....