精通Hibernate管理缓存

开发
管理Hibernate缓存(Managing the caches)在Hibernate应用中很重要,无论何时,当你给save()等方法传递一个对象时,或使用load()等方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。

无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。

当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

  1. ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set  
  2. while ( cats.next() ) {  
  3.     Cat cat = (Cat) cats.get(0);  
  4.     doSomethingWithACat(cat);  
  5.     sess.evict(cat);  

Session还提供了一个contains()方法,用来判断某个实例是否处于当前session的缓存中。

如若要把所有的对象从session缓存中彻底清除,则需要调用Session.clear()。

对于二级缓存来说,在SessionFactory中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。

  1. sessionFactory.evict(Cat.class, catId); //evict a particular Cat  
  2. sessionFactory.evict(Cat.class);  //evict all Cats  
  3. sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens  
  4. sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections 

CacheMode参数用于控制具体的Session如何与二级缓存进行交互。

CacheMode.NORMAL - 从二级缓存中读、写数据。

CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。

CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。

CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。通过 hibernate.cache.use_minimal_puts的设置,强制二级缓存从数据库中读取数据,刷新Hibernate缓存内容。

如若需要查看二级缓存或查询Hibernate缓存区域的内容,你可以使用统计(Statistics) API。

  1. Map cacheEntries = sessionFactory.getStatistics()  
  2.         .getSecondLevelCacheStatistics(regionName)  
  3.         .getEntries(); 

此时,你必须手工打开统计选项。可选的,你可以让Hibernate更人工可读的方式维护Hibernate缓存内容。

  1. hibernate.generate_statistics true  
  2. hibernate.cache.use_structured_entries true 

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. 简单学会Hibernate对象持久化
  5. 分析Hibernate自增主键
责任编辑:仲衡 来源: javanb
相关推荐

2012-02-08 14:24:35

HibernateJava

2009-07-02 09:23:27

Hibernate缓存

2009-06-29 08:48:41

Hibernate缓存

2012-02-08 11:15:38

HibernateJava

2012-02-08 12:17:38

HibernateJava

2012-02-03 11:31:33

HibernateJava

2009-09-25 13:51:13

Hibernate S

2009-06-17 15:43:03

Hibernate缓存

2009-09-23 17:03:08

Hibernate S

2012-02-08 14:01:18

HibernateJava

2009-09-22 10:50:04

Hibernate c

2009-09-22 11:24:07

Hibernate查询

2009-06-30 14:08:00

Hibernate缓存

2009-06-17 15:13:30

2009-09-27 14:53:38

Hibernate S

2009-06-18 14:51:12

Hibernate缓存Hibernate

2012-02-08 13:34:08

HibernateJava

2012-02-08 11:01:53

HibernateJava

2009-09-28 09:47:55

Hibernate数据

2009-09-25 16:29:32

Hibernate一级
点赞
收藏

51CTO技术栈公众号