Hibernate清理缓存

 

在默认情况下,session会在下面的时间点清理缓存

1 当应用程序调用net.sf.hibernate.Transactioncommit()方法时,commit()方法先清理缓存,然后再看数据库提交事务

2 当调用sessionfind()或者iterator()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。

3 当应用程序显式调用sessionflush()方时。

Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。例如,以下代码显示把清理模式设为FlushModo.Commit:

    session.setFlushMode(FlushMode.COMMIT);

三种清理模式

 

 清理缓存的模式

 Session的查询方法

 Session的commit()方法

 Session的flush()方法

 FlushMode.AUTO 清理 清理 清理
 FlushMode.COMMIT 不清理 清理 清理
 FlushMode.NEVER 不清理 不清理 不清理

 

    FlushMode.AUTO是默认值,这也是优先考虑的清理模式,它会保证在整个事务中,数据保持一致。如果事务公包含查询数据库的操作,而不会修改数据库的数据,也可以选用FlushMode.COMMIT模式,这可以避免在执行Session查询方法时先清理缓存,以稍微提高应用程序的性能。

    在大多数情况下,应用程序不需要显示调用Session的flush()方法,flush()方法适用于以下场合:

    (1)插入、删除或更新某个持久化对象会引发数据库中的触发器。假定向CUSTOMERS表新增一条记录时会引发一个数据库触发器,在应用程序中,通过Session的save()方法保存了一个Customer对象,应用随后调用Session的flush()方法:

      session.save(customer);

      session.flush();

    Session的flush()方法会立即执行insert语句,该语句接着引发相关的触发器工作。

    (2)在应用程序中混合使用Hibernate API和JDBC API。

    (3)JDBC驱动程序不健壮,导致Hibernate在自动清理缓存的模式下无法正常工作。

来自:http://blog.sina.com.cn/s/blog_530bf5d20100byk5.html

 

我们知道,如果一味的让新的数据放到缓存中去,那我们计算机肯定会内存崩溃。所以进行必要的缓存清除还是很有必要的。
下面我们分析一下几种方法:
1 clear()方法
  我们可以在session-factory标签下创建property标签,name属性为hibernate.jdbc.batch_size,值为我们想要设定的数字,假如为100,下一步当我们执行操作flush()发送SQL语句时候调用session.clear()方法,就可以实现清除缓存的效果了。
Java代码 复制代码
  1. for(int i=0;i<1000;i++){   
  2. Order order = new Order();   
  3. order.setId();   
  4. session.save(order);   
  5. if(i%100==0){   
  6. session.flush();   
  7. session.clear();   
  8. }   
  9. }  
for(int i=0;i<1000;i++){
Order order = new Order();
order.setId();
session.save(order);
if(i%100==0){
session.flush();
session.clear();
}
}


2 evict()方法
  该方法于上一个方法不同,它只能用于处理单个对象的清除工作。
Java代码 复制代码
  1. for(int i=0;i<1000;i++){   
  2. Order order = new Order();   
  3. order.setId();   
  4. session.save(order);   
  5. session.evict();//清除session缓存   
  6. SessionFactory.evict();//清除二级缓存   
  7. }  
for(int i=0;i<1000;i++){
Order order = new Order();
order.setId();
session.save(order);
session.evict();//清除session缓存
SessionFactory.evict();//清除二级缓存
}

     
     
Hibernate Session清理缓存的时间 (2009-02-10 13:50:54)

在默认情况下,Session会在下面的时间点清理缓存。

  • 当应用程序调用net.sf.hibernate.Transacation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
  • 当应用程序调用Session的find()或者iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。
  • 当应用程序显示调用Session的flush()方法的时候。

注意Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值