对hibernate的理解及缓存机制

一级缓存(session缓存)

1、Session的save()方法持久一个对象后,该对象加入到session的缓存中,以后即使应用程序中的引用变量不再引用该对象,只要session的缓存中没有被清空,该对象仍然处于生命周期中。

2、当Session的get方法视图从数据库中加载对象时,Session优先判断缓存是否存在该对象,如果存在,则不需要去数据库中检索,对象是存在内存中的

Session清理缓存 

清理缓存是指按照缓存中的对象的属性变化来同步更新数据库

 清理缓存的时间点

1、调用commit(),commit()方法先清理缓存,然后再想数据库提交事务

2、调用Query查询接口等执行查询操作的时候,如果缓存中持久化了对象的属性变化,就会先清理缓存以保证查询结果为最新。

3、显示调用Session的flush()方法的时候

如何清理以及缓存?

1、通过session.clear();//清除所有缓存

2、session.evict();//清除指定缓存

二级缓存(SessionFactory缓存)

       由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

      save、update、saveOrupdate、load、get、list、query、Criteria方法都会填充二级缓存

  get、load、iterate会从二级缓存中取数据session.save(user)   

  如果user主键使用“native”生成,则不放入二级缓存.

  第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。
Hibernate的二级缓存策略的过程如下:

1)条件查询的时候,总是发出一条select * from table_name where .....(选择所有字段)这样的SQl语句查询数据库,一次获得所有的数据对象。

2)把获得的所有数据对象根据ID放入到第二级缓存中。

3)当Hibernate根据ID访问数据对象的时候,首先从Session的一级缓存中查,查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

4) 删除、更新、增加数据的时候,同时更新缓存。

Hibernate的二级缓存策略,是针对ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的查询缓存(Query Cache)。

如何清除二级缓存?

需要用SessionFactory来管理二级缓存

什么样的数据适合存放到第二级缓存中?   
  1) 很少被修改的数据   
  2) 不是很重要的数据,允许出现偶尔并发的数据   
  3) 不会被并发访问的数据   
  4) 常量数据   
不适合存放到第二级缓存的数据?   
  1) 经常被修改的数据   
  2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   
  3) 与其他应用共享的数据
HIbernate是如何实现延迟加载

Hibernate3提供了属性的延迟加载功能,当hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在于内存中,就实现了延迟加载,它节省了服务器的内存开销,从而提高了服务器的性能。

OID查询

即我们平常使用的session.get(类名.class,cid);

HQL查询

hql:hibernate query lauguage即hibernate提供的一种查询语句,它和sql很相似,但是最大的区别是:SQL操作数据库表和字段,而hql操作的是实习类和属性。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值