- 浏览: 1231054 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
一级缓存与session周期一致,二级缓存与sessionFactory一致。
session一级缓存 1、一级缓存很短,和session的生命周期一致,随着session的关闭而消失 *load/get/iterate(查询实体对象)可以使用缓存数据 2、一级缓存它缓存的是实体对象 3、如果管理缓存,如session.clear()/session.evict() 4、如何避免一次性大批量实体数据插入内存溢出的问题? *先执行flush,在用clear清除缓存
班级与学生类,一对多示例演示
package com.bjsxt.hibernate; import java.io.Serializable; import org.hibernate.Session; import junit.framework.TestCase; public class CacheLevel1Test extends TestCase { /** * 发出两次load查询,只发出一条语句 * */ public void testCache1() { Session session = null; try { session = HibernateUtils.getSession(); Student student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); //因为有一级缓存,load方法使用一级缓存,所以本次查询不再发出sql student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 发出两次get查询 * */ public void testCache2() { Session session = null; try { session = HibernateUtils.getSession(); Student student = (Student)session.get(Student.class, 1); System.out.println("学生姓名:" + student.getName()); //因为有一级缓存,get方法使用一级缓存,所以本次查询不再发出sql student = (Student)session.get(Student.class, 1); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 发出两次iterate查询实体对象 * */ public void testCache3() { Session session = null; try { session = HibernateUtils.getSession(); Student student = (Student)session.createQuery("from Student where id=1").iterate().next(); System.out.println("学生姓名:" + student.getName()); //因为有一级缓存,iterate方法使用一级缓存,发出查询id的sql,不再发出查询实体对象的sql,一级缓存它缓存的是实体对象 student = (Student)session.createQuery("from Student where id=1").iterate().next(); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 发出两次iterate查询普通属性 * */ public void testCache4() { Session session = null; try { session = HibernateUtils.getSession(); String name = (String)session.createQuery("select name from Student where id=1").iterate().next(); System.out.println("学生姓名:" + name); //Iterate查询普通结果集,一级缓存不会缓存,它也不会发出查询id的sql name = (String)session.createQuery("select name from Student where id=1").iterate().next(); System.out.println("学生姓名:" + name); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 打开两次session,调用load测试 * */ public void testCache5() { Session session = null; try { session = HibernateUtils.getSession(); Student student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } //打开第二个session try { session = HibernateUtils.getSession(); //会发出sql,session间是不能共享一级缓存数据的 //因为它会伴随session的生命周期存在和消亡 Student student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 先执行save,再执行load进行测试 * */ public void testCache6() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Student student = new Student(); student.setName("张三"); Serializable id = session.save(student); //因为save会将实体对象的数据缓存到session中 //所以再次查询相同数据,不会发出sql Student newStudent = (Student)session.load(Student.class, id); System.out.println("学生姓名:" + newStudent.getName()); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 执行session.clear()或session.evict()方法后,再调用load */ public void testCache7() { Session session = null; try { session = HibernateUtils.getSession(); Student student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); //管理session缓存(一级缓存机制无法取消的,但可以管理缓存,如:clear,evict方法) session.evict(student); //session.clear(); //发出sql,因为缓存中的student实体类,已经被逐出 student = (Student)session.load(Student.class, 1); System.out.println("学生姓名:" + student.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } /** * 向数据库中插入10000学生数据 * */ public void testCache8() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); for (int i = 0; i < 10000; i++) { Student student = new Student(); student.setName("Student_" + i); session.save(student); //每100条数据就强制session将数据持久化 //同时清空缓存,以避免在大量的数据下,造成内存溢出 if ( i % 100 == 0) { session.flush(); session.clear(); } } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
- hibernate_cache_level1.rar (14.1 KB)
- 下载次数: 8
发表评论
-
Hibernate抓取策略二
2010-05-11 17:56 1070在Classes与Student一对多映射中,我们将Set里面 ... -
Hibernate抓取策略一
2010-05-11 16:29 1315抓取策略指多表关联查询的时候,Hibernate会发出多条sq ... -
Hibernate查询缓存
2010-05-11 01:15 1611二级缓存中,如果不设置“查询缓存”,那么hibernate只会 ... -
Hibernate所需完整类库
2010-05-11 01:08 884附件为最新配置Hibernate所需的包. 由来: 一、下 ... -
Hibernate 二级缓存缺少包出现的异常
2010-05-10 23:29 2325由于二级缓存使用的包org.hibernate.cache.E ... -
转:Hibernate性能优化之二级缓存
2010-05-10 17:28 1134http://chenhongbin007.blog.163. ... -
Hibernate lazy加载FOR 单端关联
2010-05-10 00:54 1310Hibernate单端关联懒加载策略:即在<one-to ... -
Hibernate lazy加载FOR Connection
2010-05-10 00:28 1185Hibernate集合属性的懒加载策略: 在集合属性上, ... -
Hibernate lazy加载FOR Class
2010-05-09 23:51 1041lazy策略可以用在: * <class>标签 ... -
Hibernate性能优化:二级缓存
2010-05-06 16:48 1060hibernate二级缓存 定义步骤: 1、打开缓存, ... -
Hibernate悲观锁与乐观锁及事务管理机制
2010-05-06 11:57 1181引用: 悲观锁与乐观锁: http://www.iteye ... -
Hibernate学习笔记博客
2010-05-06 11:32 716网上也有人自学hibernate的笔记 http://hi. ... -
Hibernate与EJB的区别
2010-05-05 18:09 866Hibernate不支持分布式应用 -
Hibernate对象状态
2010-05-05 17:48 1767Hibernate对象有三种状态: 瞬时状态(Transie ... -
Hibernate HQL示例十二:DML更新、删除及与Hibernate持久化更新
2010-05-05 16:42 1964DML更新及删除 示例: package com.bjsx ... -
Hibernate HQL示例十一:分页查询
2010-05-05 16:21 1129分页查询: select * from t_student ... -
Hibernate HQL示例十:统计查询
2010-05-05 15:57 2109统计函数的使用 count(*) 等 package co ... -
Hibernate HQL示例九:连接查询
2010-05-05 15:38 3534inner join left out join rig ... -
Hibernate HQL示例八:查询对象导航及Implicit Join
2010-05-05 10:32 1681通过Student对象导航到class对象的id 如下: ... -
Hibernate HQL示例七:查询过滤器的使用
2010-05-05 01:58 1319查询过滤器指的是:配置好后,会在该对象上的每一条查询语句上自动 ...
相关推荐
二级缓存是Hibernate性能优化的重要手段,通过合理配置和使用,可以显著减少数据库访问,提高系统响应速度。但同时,需要注意缓存的副作用,如数据一致性、并发控制等问题。在实际应用中,需要结合业务场景和性能...
一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象被加载到内存中时,它们会被存储在一级缓存中。一级缓存是事务级的,意味着它只存在于当前事务内,一旦事务提交或回滚,一级...
本文将详细讲解Hibernate中的三级缓存:一级缓存、二级缓存和查询缓存。 ### 1. 一级缓存 一级缓存是Hibernate内置的Session级别的缓存,也被称为事务性缓存。每当我们在Session中进行对象的CRUD(创建、读取、...
一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们在Session中对对象进行 CRUD(创建、读取、更新、删除)操作时,这些对象会被自动放入一级...
它是一个事务范围的缓存,也就是说,每个 Hibernate Session 对应一个一级缓存,仅在当前事务中有效。一级缓存主要存储了 Session 在当前事务中加载和修改的对象实例。当 Session 执行 CRUD 操作时,对象会自动放入...
标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...
在 Hibernate 中,一级缓存是默认开启的一种缓存机制,对于提高应用程序性能有着重要作用。一级缓存位于 Session 对象中,是每个 Session 的私有缓存,它存储了从数据库中读取的对象实例。 一级缓存的工作原理: 1....
Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动管理。它存储了当前会话期间加载的所有实体对象和关联的集合对象。当会话关闭时,一级缓存中...
例如,当我们第一次从数据库加载一个实体后,再次请求该实体时,Hibernate会首先在一级缓存中查找,而不会去数据库查询,从而提高了性能。在实际项目中,合理利用一级缓存可以显著减少数据库的负载。 接下来是二级...
### 优化一级缓存 1. **缓存大小设置**:可以通过配置`hibernate.cache.size`来调整一级缓存的最大容量,以适应不同应用场景的需求。 2. **及时清理无用对象**:在业务逻辑中,可以适时调用`Session.evict()`方法...
《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...
通常,一级缓存由Hibernate Session管理,而二级缓存则可以跨越多个Session进行共享。 在Spring Boot项目中配置Redis作为Hibernate的二级缓存,我们需要以下步骤: 1. **添加依赖**: 首先,在`pom.xml`文件中...
在Hibernate中,缓存分为一级缓存和二级缓存。一级缓存是SessionFactory级别的,每个Session在操作数据时,都会将实体对象放入一级缓存,它是线程安全的,但生命周期较短,随着Session关闭,一级缓存中的数据也会被...
《Hibernate性能优化》 在Java应用开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,如果不进行适当的优化,它可能会成为系统性能的瓶颈。以下是一些关于Hibernate性能优化...
- 一级缓存:每个 Hibernate Session 对象都有一个一级缓存,它是默认开启的。当对象被加载到 Session 中,它们会被存储在一级缓存中,直到 Session 被关闭。一级缓存是事务范围的,只对当前 Session 可见。 - 二...
本文将详细介绍Hibernate的一级缓存和二级缓存。 一级缓存,也称为Session缓存,是Hibernate内置的默认缓存。它是一个事务级别的缓存,每个持久化类的实例都有唯一的OID(Object Identifier)。当我们在同一个...