hibernate的缓存

来源:互联网 发布:apache的httpclient包 编辑:程序博客网 时间:2024/06/04 19:31

hibernate session级缓存

 在同一个session中,支持load、get、iterate

1、在同一个session中通过load或get根据id得到对象实体将使用缓存

2、在同一个session中通过iterate得到也会使用缓存

       例如:...where id<5...,第一条查询语句查询id,后面的语句再根据id查询对象实体,如果后面的查询是...where id<6...,也会发出一条查询语句查询id,但是如果前面查询到的对象将不会再查询,只查询前面没有查询到的对象。

3、其实save也支持缓存,当把一个对象先save后,在调用load或get方法,不会发出查询语句

       但是对象的属性不会缓存,一级缓存只缓存对象

 

hibernate二级缓存

 

       二级缓存被所有的session共享,他的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存,

       在不同的session中,支持load、get、iterate,iterate和一级缓存的一样,也是先根据条件查询id,再根据id查询对象实体,两个session中的实体对象一样,第二个session不会发出查询语句

       evict方法清除缓存,setCacheMode(CacheMode.IGNORE)方法禁用一级缓存中的数据放到二级缓存中

 

hibernate查询缓存

       开启查询,关闭二级缓存,采用query.list()查询普通属性,在多个session中只发出一条查询语句,但是query.iterate()不会这样,照样发出语句

       关闭查询和二级缓存,采用query.list()查询对象实体,会发出语句

       开启查询,关闭二级缓存,采用query.list()查询对象实体,在除第一个session以外的session会发出n条查询语句。注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。

       开启查询和二级缓存,采用query.list()查询对象实体,在除第一个session以外的session不会发出语句,这时候使用的是二级缓存缓存的对象


 

hibernate大批量数据的插入问题

       测试:一次插入10万条数据还正常,当插入100完数据的时候出现了java.lang.OutOfMemoryError:Java heap space异常

       优化:即每插入20条数据session.flush();和session.clear();这样就会很稳定,这时候的瓶颈应该的数据库本身了,我是这么认为的

       注意:大批量数据更新时,如果配置了二级缓存建议禁用一级缓存和二级缓存的交互



原创粉丝点击