- 浏览: 347180 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
zy_mensheng:
请问一下 怎么 js没有解析啊 还是钟表图..
调用BIEE提供的web service -
安铁辉:
师兄你很久没更新博客了
Information Dashboard Design读书笔记 -
mojunbin:
很清晰的文章
秒杀相关知识以及技术 -
yanchangjun8102:
楼主你好,我也最近在研究biee的webservice这块,按 ...
调用BIEE提供的web service -
sacredon:
不错,楼主我是看着你的这篇文章写代码调用的BIEE的Web ...
调用BIEE提供的web service
hibernate的内部缓存
hibernate的缓存分为两级:一级缓存(session级)和二级缓存(sessionFactory级)
缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存,从缓存中获取数据,删除缓存中的无效数据。
一级缓存,Session级共享。
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中。一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。
例:
Person p = (Person)s.get(Person.class, id); Person p = (Person)s.get(Person.class, id);
连续两次执行该语句,sql语句的select查询只有一句输出。说明其中一次查询是到缓存中拿数据的。
query不能够从缓存中取数据。从缓存中取数据的方法不多。把数据放到缓存中的方法有很多。
static void query(int id) { Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Worker worker = (Worker) s.get(Person.class, id); Worker worker2 = (Worker) s.get(Worker.class, id); tx.commit(); System.out.println(worker.getWork_year()); }
运行以上代码,执行的sql语句为:
执行了两次s.get(),但只有一条select语句,说明第二次是从缓存中取的数据。
session的evict方法用于清除对应的缓存对象。session的clear方法清除整个session缓存。
一级缓存的缺陷:
对缓存中的数据量没有限制。数据量的不断累积,造成内存溢出。 没有什么保护,共享的范围较小。缓存的时间较短暂。一般存在于一次请求中。
二级缓存,sessionFactory级共享
hibernate的二级缓存交给了第三方的缓存框架来处理。
打开hibernate的二级缓存,在hibernate配置文件中配置。不过默认二级缓存是打开的:
<property name="hibernate.cache.use_second_level_cache">true</property>
实现为可插拔,通过修改cache.provider_class参数来改变;
缓存提供者配置,一般是第三方缓存框架:
<property name="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
在配置前要确认使用的缓存的jar包应该导入到项目中了。
还要配置需要缓存的类:方法有两种。
①在hibernate配置文件中指定:
<class-cache class="hibernatetest.User" include="all" usage="read-only"/>
类必须是全限定名。usage表示缓存的策略,有四个值可选。
注意: The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collection-cache)*,event*,listener*)" 缓存类的配置必须在maping文件配置的后面,否则会报错。
②在映射文件中指定:
<hibernate-mapping package="hibernatetest">
<class name="User" table="`user`">
<cache usage="read-only"/>
<id name="id">
<generator class="hilo"/>
</id>
.......
hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。
验证:
public class Main {
static User query(int id) {
User user = null;
Session session = null;
try {
session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
user = (User) session.get(User.class, id);
System.out.println(user.getUserName());
user = (User) session.get(User.class, id);
tx.commit();
session.clear();
} finally {
if (session != null) {
session.close();
}
}
Session s = null;
try {
s = HibernateUtil.getSession();
Transaction txn = s.beginTransaction();
user = (User) s.get(User.class, id);
txn.commit();
} finally {
if (s != null) {
s.close();
}
}
return user;
}
public static void saveUser(User user) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Name name = new Name();
name.setFirstName("firstName");
name.setLastName("lastName");
user.setUserName(name);
session.save(user);
tx.commit();
session.close();
}
public static void main(String[] args) {
User user = new User();
user.setBirthday(new Date());
saveUser(user);
query(1);
Statistics st = HibernateUtil.getSessionFactory().getStatistics();
System.out.println("put:"+st.getSecondLevelCachePutCount());
System.out.println("hit:"+st.getSecondLevelCacheHitCount());
System.out.println("miss:"+st.getSecondLevelCacheMissCount());
System.out.println(st.getConnectCount());
}
使用信息统计之前要在hibernate配置文件中配置:
<property name="hibernate.generate_statistics">true</property>
不设置缓存会打印输出sql语句。我设置了缓存,却无法查询了,连一条select语句也没有。sql语句为:
Hibernate: insert into user (first_name, last_name, birthday, id) values (?, ?, ?, ?)
hibernatetest.Name@12a55aa
put:1
hit:2
miss:0
3
后来把user的主键生成方式改为native(一开始使用的hilo)
输出的sql语句为:
Hibernate: insert into user (first_name, last_name, birthday) values (?, ?, ?)
Hibernate: select user0_.id as id0_0_, user0_.first_name as first2_0_0_, user0_.last_name as last3_0_0_, user0_.birthday as birthday0_0_ from user user0_ where user0_.id=?
hibernatetest.Name@e0cc23
put:1
hit:1
miss:1
3
两次的结果不一样。这跟主键的生成方式有关。
分析:
session的save(这个方法不适合native生成方式的主键
)
对于native的主键生成方式而言,在程序中保存对象时,并没有把数据放到二级缓存中去。hibernate在查询数据时,先到session中,即一级缓存中查找,如果有就返回。如果没有找到,则到二级缓存中去找,如果找到则返回。如果还是没有找到,才会建立一条连接到数据库中去查询。在第一次查询时,两个缓存中都没有,所以会有一次miss。在通过建立连接获得数据时会在一级和二级中都进行缓存数据。所以打印出put:1 ,然后把session关闭后,一级缓存没有了。再次查询,虽然一级缓存没有相应的数据,但能够最终在二级缓存中获得数据,所以达到了一次命中,所以打印出了hit:1.
不过使用高低键的主键生成方式,会在save的时候,就会把数据放到缓存中去了。所以会有一次put。所以在每次查询时都能够在二级缓存中找到数据,所以命中了2次,打印出hit:2,miss:0。
结果也显示连接的次数为3次,我们的程序中获得3次session。
总结:
session的save(这个方法不适合native生成方式的主键)
update,saveOrUpdate,list,iterator,get,load以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时)Session的iterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)。
Query,Criteria(查询缓存)由于命中率较低,因为要查询语句一样,才会命中,这一般不常见。所以hibernate缺省是关闭;修改cache.use_query_cache为true打开对查询的缓存,并且调用query.setCacheable(true)或criteria。setCacheable(true)。
SessionFactory中提供了evictXXX()方法用来清除缓存中的内容。
统计信息打开generate_statistics,用sessionFactory.getStatistics()获取统计信息。
有时间可以去研究一下分布式缓存和中央缓存。
使用缓存的条件
1,读取大于修改
2,数据量不能超过内存容量
3,对数据要有独享的控制
4,可以容忍出现无效数据
发表评论
-
hibernate学习之十八篇
2009-03-16 17:27 816hibernate不适合的场景: 1,不适合OLAP(on- ... -
hibernate学习之十七篇
2009-03-16 12:31 1002零碎知识小结: ◆数据类型: 1,<propert ... -
PO and POJO
2009-03-11 23:49 831原文:http://danni505.blog.51cto.c ... -
hibernate学习之第十六篇
2009-03-11 21:36 1499session context和事务边界 用current_ ... -
hibernate学习之第十五篇
2009-03-11 21:33 1045事务与事务边界 hibernat ... -
Hibernate二级缓存攻略(转)
2009-03-09 22:56 884Hibernate二级缓存攻略(转) 很多人对二级缓存都不太 ... -
hibernate学习之第十三篇
2009-03-09 17:41 1017load方法的懒加载及原理分析 懒加载的目的,减少不必要的数 ... -
hibernate学习之第十二篇(续)
2009-03-06 19:10 994《四》每个具体类映射 ... -
hibernate学习之第十二篇
2009-03-06 15:57 957《三》混合使用“一个 ... -
hibernate学习之第十一篇(2)
2009-03-05 23:00 905《二》每个子类映射到一张表(joined-subclass) ... -
hibernate学习之第十一篇(1)
2009-03-05 22:55 1498hibernate的继承映射 《一》一张表映射一棵继承树 ... -
hibernate学习之第十篇
2009-03-05 13:53 1144级联和关系维护 Cascade 用来说明当对主对象进行某种操 ... -
hibernate学习之第九篇
2009-03-04 22:52 1352hibernate中的集合类型 引入: Hibernate ... -
hibernate学习之第八篇
2009-03-03 22:11 1006组件映射 关联的属性是个复杂类型的持久化类,但不是实体即: ... -
hibernat学习之第七篇
2009-03-03 13:06 980多对多关联关系的映射 在操作和性能方面都不太理想,所以多对 ... -
hibernate 学习之第六篇
2009-03-02 20:31 946基于主键的一对一关联 Person类和IdCard,一对一 ... -
深入浅出hibernate摘录2
2009-03-02 00:38 1550以下内容摘自深入浅出hibernate 在编写代码的时候,尽 ... -
深入浅出hibernate摘录
2009-03-01 19:45 1248以下摘自深入浅出hiberna ... -
hibernate学习之第五篇
2009-03-01 19:43 10821, oracle数据库中,user是关键字,如果用户的表名为 ... -
hibernate学习之第四篇(对象状态)
2009-03-01 19:38 1087session 的几个主要方法 ...
相关推荐
本篇将主要围绕`Hibernate3中文参考手册`展开,深入探讨Hibernate的基础概念、配置、实体映射、查询语言以及其他关键特性。 1. **Hibernate概述** Hibernate是一个开源的ORM框架,它提供了对Java应用程序的数据库...
这篇文档旨在提供对Hibernate API的深入理解,帮助开发者更高效地使用Hibernate进行数据库操作。 一、Hibernate概述 Hibernate是Java开发中广泛使用的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的...
本篇将详细解析Hibernate 4.1 Core API,帮助开发者深入理解其核心概念、类库和接口。 1. **对象关系映射(ORM)**:ORM是Hibernate的核心特性,它将Java对象与数据库表进行映射,使得程序员可以避免编写大量的SQL...
本篇内容将通过丰富的实例来深入探讨Hibernate的核心概念和技术,帮助读者从入门到精通,掌握其所有主要用法。** ### 一、Hibernate 概述 Hibernate 提供了一种在Java应用程序中管理关系数据库模型的机制。它通过...
本篇将深入探讨“Java Persistence with Hibernate”的核心概念,并通过具体的示例来帮助理解其工作原理和使用方法。 一、Hibernate简介 Hibernate是一个开源的Java库,它提供了在Java应用程序中与关系数据库进行...
这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...
这篇文档将深入探讨Hibernate API的各个方面,帮助开发者更好地理解和使用它。 一、Hibernate体系结构 Hibernate主要由以下组件构成: 1. Configuration:负责读取配置文件,建立SessionFactory。 2. ...
本篇攻略将深入探讨Hibernate的基础知识,帮助初学者理解并掌握其核心概念。 1. ** Hibernate简介** Hibernate是一个开源的ORM框架,它允许开发人员在Java应用中使用面向对象的方式来处理数据库。通过提供对象与...
**标题:“Hibernate文档”** ...通过阅读“Hibernate1.ppt”这个文件,你将有机会深入学习这些概念,并掌握如何在实际项目中应用Hibernate。理解并熟练运用这些知识点,将有助于提升你的Java EE开发技能。
这篇笔记主要涵盖了Hibernate框架的基础知识,它是Java开发中用于对象关系映射(ORM)的热门工具。Hibernate允许开发者用Java对象来操作数据库,消除了传统的JDBC代码,提高了开发效率和代码的可维护性。 一、...
这篇文档是Hibernate的中文API,为学习和使用Hibernate提供了一个直观且易于理解的参考。 一、Hibernate概述 Hibernate是Java领域中广泛使用的ORM框架,它将数据库的操作转换为对Java对象的操作,通过配置文件和...
Hibernate的缓存管理是其性能优化的关键,可能会讲解第一级缓存(Session缓存),第二级缓存(SessionFactory缓存),以及查询缓存的工作原理和配置。 6. **Chapter 10:事务与并发控制** 事务管理是数据库操作的...
第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 Hibernate的会话与O/R映射 第20...
第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 Hibernate的会话与O/R映射...
第四篇为“数据库访问技术”,主要讲述JDBC技术及JSP和Servlet如何通过JDBC访问数据库,以及如何改进数据库的访问和目前流行的Hibernate、iBATIS及Spring集成访问的支持;第五篇为“标签语言和表达式语言”,主要...
第14章 Struts2框架应用 第15章 Struts2框架标签应用 第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与...
第14章 Struts2框架应用 第15章 Struts2框架标签应用 第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与架构模式篇 第20章 网站性能优化与...
在实际的项目中,"14_01"可能代表课程或者章节编号,表示这是关于Struts2基础的第14个主题或第1篇笔记。可能涵盖了Action的创建、结果映射、拦截器的使用、Struts2的Ognl表达式、以及如何在Struts2中集成Spring和...
本篇将基于提供的"hibernate ref document"进行深入解析,旨在帮助开发者更好地理解和应用Hibernate。 一、Hibernate概述 Hibernate是一种开放源代码的Java库,它允许开发人员在Java应用程序中使用面向对象的方式来...
7. **J2EE教程第46-54篇** - 地址:http://www.ibeifeng.com/read.php?tid=1068&u=1007 - 继续深入探讨J2EE技术,包括高级主题和实践技巧。 8. **X系统SSH全套教程** - 地址:...