Hibernate 3一级缓存应用经验谈

开发 后端
本文向您介绍Hiberante 3一级缓存使用中的一些经验,包括Session缓存、List()和iterate 查询区别、数据库事物级别关系等。

1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消,用两个方法管理,clear(),evict()

2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁;

3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果

使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!

4.iterate 查询使用缓存,会发出查询Id的SQL和HQL语句,但不会发出查实体的,

它查询完会把相应的实体放到缓存里边,一些实体查询如果缓存里边有,就从缓存中查询,但还是会发出查询id的SQL和HQL语句。如果缓存中没有它会数据库中查询,然后将查询到的实体一个一个放到缓存中去,所以会有N+1问题出现。

5.List()和iterate 查询区别:

使用iterate,list查询实体对象*N+1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题

所谓的N+1是在查询的时候发出了N+1条sql语句1:首先发出一条查询对象id列表的sqlN:

根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句list和iterate的区别?

list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据

iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题

6.Get()和load(),iterate方法都会使用一级缓存,

 7.hiberate3 session 存储过程如下:

例如 object 对象

Session.save(object);

这时候不会把数据放到数据库,会先放到session缓存中去,数据库中没有相应记录,session.flush();才发SQL和HQL语句,数据库中有了相应记录,

但是数据库用select查不到,这是跟数据库事物级别有关系。

Session.beginTrransaction().commit();

事物提交后可以查询到了。

Session.flush()语句但是为什么不写呢,因为commit()会默认调用flush();

【编辑推荐】

  1. Hibernate的继承关系
  2. Hibernate延迟加载与DAO模式的整合
  3. 有关Hibernate延时加载与lazy机制
  4. Hibernate访问多个数据库
  5. Hibernate的lazy属性总结
责任编辑:佚名 来源: blogjava
相关推荐

2009-09-25 16:29:32

Hibernate一级

2009-09-14 15:04:44

2009-09-23 09:37:07

Hibernate缓存

2011-09-09 09:50:40

Oracle

2009-09-21 17:09:38

Hibernate C

2009-07-04 15:17:37

2013-07-29 12:45:19

iOS开发经验iOS提高应用开发效率

2011-04-07 09:57:34

2024-05-28 07:01:29

2009-08-13 18:12:12

Hibernate 3

2009-06-29 15:39:53

Servlet和JSPServlet引擎

2015-09-16 10:13:16

游戏性能

2012-07-13 14:25:59

2017-01-20 09:43:12

日志告警挖掘

2010-08-17 13:23:49

2011-08-15 10:27:48

2014-03-13 09:20:38

jQueryAngularJs

2011-06-21 16:26:19

SEO内部优化

2013-08-02 11:23:45

2012-10-24 09:11:03

虚拟
点赞
收藏

51CTO技术栈公众号