- 浏览: 415123 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
夜行侠:
基于微博数据检测的Solr实战开发课程观看地址:http:// ...
SolrCloud之搭建SolrCloud集群 -
夜行侠:
基于微博数据检测的Solr实战开发课程观看地址:http:// ...
SOLR使用手册之优化及拓展 -
夜行侠:
基于微博数据检测的Solr实战开发课程观看地址:http:// ...
SOLR拼写检查相关 -
houzhanshanlinzhou:
写的不错,非常详细
SOLR使用手册之查询语法 -
王庆波-行:
期待!……
redis安装使用-终极篇(分布式、集群配置)
hibernate 一级缓存:(缓存的是实体对象)
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务缓存
哪些方法支持一级缓存:
*get()
*load()
*iterate() (查询实体对象)
如何管理一级缓存:
* session.clear() session.evict()
如何避免一次性大量的实体数据入库导致内存溢出
*先flush,再clear
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求,可以考虑采用数据库本身的特定导入工具
一.Load测试: 在同一个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候也不会查询数据库,因为他在缓存里找到,不会发出sql
Load测试: 开启两个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,因为session间不能共享一级缓存的数据,因为他会随session的生命周期存在和消亡
二.Get测试: 在同一个session中发出两次get查询
Student sutdent = (Student)session.get(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.get(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次get查询, 第一次get的时候去查询数据库,第二次get的时候不会查询数据库,因为他在缓存里找到,不会发出sql
三.iterate测试: 在同一个session中发出两次iterator查询
Student student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();
System.out.println(student.getName());
student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();
System.out.println(student.getName());
在同一个session中发出两次iterator查询,第一次iterate().next()的时候会发出查询id的sql,使用的时候会发出相应的查询实体对象,第二次iterate().next()的时候会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存,不会发出sql
四.Iterate查询属性测试: 同一个session中发出两次查询属性
String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();
System.out.println(name);
String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();
System.out.println(name);
在同一个session中发出两次查询属性, 第一次iterate().next()的时候会发出查询属性的sql,第二次iterate().next()的时候会发出查询属性的sql,iterate查询普通属性,一级缓存不会缓存,所以会发出sql
五.同一个session中先save,再发出load查询save过的数据
Student stu = new Student();
stu.setName(“王五”);
Serializable id = session.save(stu);
Student sutdent = (Student)session.load(Student.class,id);
System.out.println(student.getName());
save的时候,他会在缓存里放一份,不会发出sql,因为save是使用缓存的
六.同一个session中先调用load查询,然后执行sessio.clear()或session.evict(),再调用load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
session.clear();
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessio.clear()或session.evict()可以管理一级缓存,一级缓存无法取消,但可以管理.
上面的语句都会发出sql 因为一级缓存中的实体被清除了
七.向数据库中批量加入1000条数据
for(int i=0;i<1000;i++){
Student student = new Student();
student.setName(“s” + i);
session.save(student);
//每20条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出
if( i %20 == 0 ){
session.flush();
session.clear();
}
}
=========================================================================================
hibernate 二级缓存:(缓存的是实体对象,二级缓存是放变化不是很大的数据)
二级缓存也称进程级的缓存或SessionFactory级的缓存,而二级缓存可以被所有的session(hibernate中的)共享二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存
二级缓存的配置和使用:
1.将echcache.xml文件拷贝到src下, 二级缓存hibernate默认是开启的,手动开启
2.开启二级缓存,修改hibernate.cfg.xml文件,
<property name=”hibernate.cache.user_second_level_cache”>true</property>
3.指定缓存产品提供商
<property name=”hibernate.cache.provider_calss”>org.hibernate.cache.EhCacheProvider</property>
4.指定那些实体类使用二级缓存(两种方法,推荐使用第二种)
第一种:在*.hbm.xml中,在<id>之前加入
<cache usage=”read-only” />, 使用二级缓存
第二种:在hibernate.cfg.xml配置文件中,在<mapping resource=”com/Studnet.hbm.xml” />后面加上:
<class-cache class=” com.Studnet” usage=”read-only” />
二级缓存是缓存实体对象的
了解一级缓存和二级缓存的交互
测试二级缓存:
一.开启两个session中发出两次load查询(get与load一样,同样不会查询数据库),
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,开启了二级缓存,也不会查询数据库。
二.开启两个session,分别调用load,再使用sessionFactory清楚二级缓存
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
SessionFactory factory = HibernateUtil.getSessionFactory();
//factory.evict(Student.class); //清除所有Student对象
Factory.evict(Student.class,1); //清除指定id=1 的对象
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,它要查询数据库,因为二级缓存中被清除了
三.一级缓存和二级缓存的交互
session.setCacheMode(CacheMode.GET); //设置成 只是从二级缓存里读,不向二级缓存里写数据
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
SessionFactory factory = HibernateUtil.getSessionFactory();
//factory.evict(Student.class); //清除所有Student对象
Factory.evict(Student.class,1); //清除指定id=1 的对象
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,它要查询数据库,因为 设置了CacheMode为GET,(load设置成不能往二级缓冲中写数据), 所以二级缓冲中没有数据
session.setCacheMode(CacheMode.PUT); //设置成只是向二级缓存里写数据,不读数据
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
SessionFactory factory = HibernateUtil.getSessionFactory();
//factory.evict(Student.class); //清除所有Student对象
Factory.evict(Student.class,1); //清除指定id=1 的对象
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库, 第二次load的时候也不会,当使用的时候查询数据库,它要查询数据库,因为设置了CacheMode为POST,(load设置成只是向二级缓存里写数据,不读数据)
====================================================================================
hibernate查询缓存(hibernate默认是关闭的)
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
1. 启用查询缓存:在hibernate.cfg.xml中加入:
<property name=”hibernate.cache.use_query_cache”>true</property>
2. 在程序中必须手动启用查询缓存,如:query.setCacheable(true);
测试查询缓存:
一. 开启查询缓存,关闭二级缓存,开启一个session,分别调用query.list (查询属性)
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
System.out.println(“------------------------------------------”);
query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
第二次没有去查询数据库,因为启用了查询缓存
二. 开启查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询属性)
Query query = session.createQuery(“select s.name from Student s”);
//启用查询
发表评论
-
spring profile 配置不同的环境
2014-05-14 16:42 4918如果在开发时进行一些数据库测试,希望链接到一个测试的数据库, ... -
spring 下载与配置2(常见问题)
2014-04-29 11:36 0web.xml中url-pattern的3种写法 (切 ... -
spring 下载与配置
2014-04-23 15:37 13251.下载 地址发布页: http://docs ... -
memcached缓存服务器安装与使用
2013-08-29 10:00 976简述 它可以应对任意多个连接,使用非阻塞的网络IO。它的 ... -
spring注解相关知识
2013-03-28 16:06 20921.@Resource和@Autowired 的区别 @R ... -
spring整合quartz并持久化
2013-03-28 15:44 61445spring整合quartz有两种方式: 一. ... -
spring Quartz cron表达式
2011-09-23 15:24 3030Cron表达式是一个字符串,字符串以5或6个空格隔开, ... -
struts2 类型转换器and国际化and主题
2011-03-21 16:09 1135在默认的拦截器栈中包含了名为conversionEr ... -
struts2使用要点
2011-03-21 16:08 12161. 在一个Action中包含多个处理逻辑,但是不管 ... -
struts2返回类型总结
2011-03-21 16:07 1063chain 用来处理Action链(ac ... -
Struts2国际化
2011-03-21 16:06 1244Struts2I18n ... -
struts2标签iterator
2011-03-21 16:05 1092struts2标签iterator iterato ... -
struts2 ongl
2011-03-21 16:05 1075OGNL is the Object Graph ... -
事务传播特性&事务隔离级别
2011-03-21 16:04 4241事务传播特性了解事务的几种传播特性 ... -
Spring获取bean几种方式
2011-03-21 16:03 1155方法一:在初始化时保存ApplicationContex ... -
spring 注入方式
2011-03-21 16:02 1044平常的java开发中,程序员在某个类中需要依赖其它类的方法 ... -
spring Aop概念
2011-03-21 16:01 1362AOP概念 切面(Aspect) 与类很 ... -
open session in view
2011-03-21 16:00 1113在使用hibernate时 在业务层关闭sess ... -
Hibernate锁
2011-03-21 15:59 5570锁 业务逻辑的实现过程中,往往需要保证数据访问的排他 ...
相关推荐
hibernate缓存机制,你必须学的持久层技术。
《Hibernate缓存机制详解》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是优化性能的关键组成部分,它减少了对数据库的直接访问,提高了数据处理效率。本文...
**标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...
Hibernate缓存机制.txt
### Hibernate缓存机制详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它简化了 Java 应用程序与数据库交互的过程。然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate ...
## Hibernate缓存机制详解 ### 一、缓存分类与管理 Hibernate提供了两种主要的缓存类型:一级缓存和二级缓存。 #### 1. 一级缓存 一级缓存也称为Session缓存,它在同一个Session中对数据的多次读取操作只需要一...
Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...
在配置Hibernate缓存时,需要明确哪些实体或查询结果应该缓存,并设置相应的缓存策略。例如,我们可以使用`@Cacheable`注解标记实体类,使用`@Cache`注解来定义缓存区域和策略。同时,对于查询结果的缓存,可以使用`...
Hibernate缓存介于Hibernate应用和数据库之间,缓存中存放了数据库数据的拷贝。 其作用是减少访问数据库的频率,从而提高应用的运行性能
Hibernate的缓存机制是优化应用程序性能的关键组成部分,它通过存储数据副本减少对数据库的直接访问,从而提升系统响应速度。缓存主要分为两类:一级缓存(Session缓存)和二级缓存。 一级缓存是Hibernate的核心...
### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...
综上所述,Hibernate缓存机制是提升应用性能的重要手段,通过合理配置缓存策略、优化查询方式、管理数据库连接以及实施有效的监控和调优措施,可以显著提高Hibernate应用的运行效率和用户体验。然而,缓存的使用并非...
Hibernate缓存机制是其性能优化的核心组成部分,对于提高应用程序的运行效率至关重要。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,通过存储数据库数据的副本来加速数据检索。 **1. Hibernate缓存...
2. Hibernate缓存机制.doc:这个文档应该详细解释了Hibernate的一级和二级缓存机制,包括缓存的生命周期、更新策略(如脏检查和锁机制)以及缓存失效策略。 3. osCache.doc:可能深入介绍了Oscache的高级特性和最佳...