apple0668
TDD,Agile,Scrum,Core Java,J2EE,Investment Blank
BlogJava
首页
新随笔
聚合
管理
随笔-61 评论-159 文章-0 trackbacks-0
系统学习hibernate之十五:hibernate一级缓存
在hibernate中,由于一级缓存的生命周期跟Session的生命周期一样,所以也可以理解为一级缓存是session缓存。
一、通过在做查询的时候,有几个查询方法支持一级缓存,它们分别是:load(),get(),iterate(),其中要注意的是iterate方法只对实体对象查询才支持一级缓存,如果使用iterate来查询对象里面的相关属性,则查询的时候不支持一级缓存。
1、load()方法。
例子:
1
Student s
=
(Student)session.load(Student.
class
,
1
);
2
System.out.println(s.getName());
3
System.out.println(
"
---------------------
"
);
4
s
=
(Student)session.load(Student.
class
,
1
);
5
System.out.println(s.getName());
PS:只发出一条sql语句,虽然这里使用两次load方法,但是第一次load方法对于id为1的记录进行加载,到第3行才发出一条sql语句及符合的数据,这样就把数据放在一级缓存里面,在第4行开始继续使用load就从一级缓存里面抽取。
2、get()方法。
例子:
1
Student s
=
(Student)session.get(Student.
class
,
1
);
2
System.out.println(s.getName());
3
System.out.println(
"
---------------------
"
);
4
s
=
(Student)session.load(Student.
class
,
1
);
5
System.out.println(s.getName());
PS:跟1中load一样,只发出一条sql语句。
3、iterate()方法查询实体对象
例子:
1
Student student
=
(Student)session.createQuery(
"
from Student s where s.id=1
"
).iterate().next();
2
System.out.println(
"
student.name=
"
+
student.getName());
3
4
//
会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存
5
student
=
(Student)session.createQuery(
"
from Student s where s.id=1
"
).iterate().next();
6
System.out.println(
"
student.name=
"
+
student.getName());
PS:总共发出3条sql语句,1、2行发出两条语句,1条是查询实体对象的sql,另一条是查询实体对象的name属性,由于使用一级缓存,之前1、2行查询的实体存放在一级缓存里面,所以5、6行利用一级缓存里面的数据只发出一条查询id的sql。
4、iterate()方法查询实体对象属性(不支持一级缓存)
例子:
1
String name
=
(String)session.createQuery(
"
select s.name from Student s where s.id=1
"
).iterate().next();
2
System.out.println(
"
student.name=
"
+
name);
3
4
//
iterate查询普通属性,一级缓存不会缓存,所以发出sql
5
//
一级缓存是缓存实体对象的
6
name
=
(String)session.createQuery(
"
select s.name from Student s where s.id=1
"
).iterate().next();
7
System.out.println(
"
student.name=
"
+
name);
PS:由于iterate()方法查询实体对象属性,一级缓存不会产生作用,所以发出两条sql语句。
二、一级缓存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通过clear(),evict()方法来清除缓存,当不需要使用一级缓存或者是更加高效率使用一级缓存。
如果在一次性更新或者加入数量量比较大的情况下,更加要管理好一级缓存。
例子:
1
for
(
int
i
=
0
;i
<
10000
;i
++
)
2
{
3
Student s
=
new
Student();
4
s.setName(
"
s
"
+
i);
5
session.save(s);
6
if
(i
%
20
==
0
)
7
{
8
session.flush();
9
session.clear();
10
}
11
}
PS:在数据量比较大的情况下管理一级缓存的做法,一般都是设定一定数量的记录给更新或者保存等操作之后,
避免一次性大量的实体数据入库导致内存溢出
,所以才去先是用第8行的flush和第9行的clear方法来实现比较好的缓存管理。在数据量特别大的时候,可以使用jdbc来实现,因为hibernate不太适合于数据量特别大的场合使用,如果连jdbc都满足不了数据量的效率要求,只好利用相关的数据库机制来实现。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必
注明作者
和
文章的详细出处地址
,否则不允许转载,多谢合作!
posted on 2008-10-31 23:39
apple0668
阅读(795)
评论(0)
编辑
收藏
所属分类:
hibernate
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
系统学习hibernate之十五:hibernate一级缓存
系统学习hibernate之十四:hibernate中HQL查询语言(二)
系统学习hibernate之十三:hibernate中HQL查询语言(一)
系统学习hibernate之十二:hibernate中悲观锁和乐观锁
系统学习hibernate之十一:set、list、map、array集合
系统学习hibernate之十:Component映射
系统学习hibernate之九:多对多关联映射(双向)
系统学习hibernate之八:多对多关联映射(单向)
系统学习hibernate之七:一对多单向关联
系统学习hibernate之六:一对一外键关联映射双向关联
Email:
chensp1230@163.com
欢迎交流
框架是告诉人们不该去做什么,而不是告诉人们该去做什么;容器是告诉人们该去做什么,而不是告诉人们不该去做什么!
<
2008年10月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
留言簿
(10)
给我留言
查看公开留言
查看私人留言
我参与的团队
深圳Java俱乐部(0/0)
Netbeans 爱好者(0/0)
随笔分类
(63)
Aglets(1)
drools(2)
eclipse(6)
groovy
hibernate(17)
java(7)
jboss
junit(3)
Log4(2)
MongoDB(1)
oracle(1)
spring(4)
struts2(8)
svn(1)
tomcat(4)
webwork(4)
web报表(1)
xml
心情港湾
集群(1)
随笔档案
(61)
2015年3月 (1)
2012年7月 (1)
2012年4月 (1)
2011年5月 (3)
2010年1月 (2)
2009年3月 (1)
2008年12月 (2)
2008年11月 (5)
2008年10月 (16)
2008年9月 (1)
2008年4月 (1)
2008年1月 (2)
2007年11月 (2)
2007年10月 (15)
2007年9月 (8)
友情链接
开源在线手册
最新随笔
1. Ehcache集群方案
2. MongoDB安装手记
3. 任何人都可以重构<转载>
4. JDK6中JWS自带webservice应用
5. 解决:Eclipse启动tomcat 访问不了 手动启动可以访问
6. IntelliJ Idea10 常用快捷键
7. Drools语法详解<转>
8. eclipse3.4安装drools插件手记
9. Java日期时间运算
10. java中使用功能强悍的正则表达式
搜索
最新评论
1. re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
非常感谢楼主分享,解决问题, Tomcat 7.0.59
--Gozs
2. re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记[未登录]
正解
--gao
3. re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
@123
已解决,谢谢提示myeclipse相关的有用信息~~
--sequoah
4. re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
赞 清空work文件夹就可以了
--维尼
5. re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
很好 问题解决了!
--兔兔
阅读排行榜
1. Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记(85498)
2. 系统学习hibernate之一:利用hibernate中的SchemaExport生成数据表(18630)
3. eclipse的第一个struts2插件:Alveole Studio MVC Web Project An eclipse plugin for Struts 2(15667)
4. Subversion之路---实现精细的目录访问权限控制<转>(11261)
5. IntelliJ Idea10 常用快捷键(9302)
评论排行榜
1. Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记(62)
2. eclipse的第一个struts2插件:Alveole Studio MVC Web Project An eclipse plugin for Struts 2(32)
3. Tomcat启动端口被占用异常处理(9)
4. 升级瑞星防火墙2008后,在myeclipse6.0中启动tomcat遇到怪问题!(7)
5. JDK6中JWS自带webservice应用(6)