Hibernate的缓存目前比较常见的使用是它的:一级缓存(Session缓存),二级缓存(第三方插件缓存)。
缓存:
缓存就是把当前查询出来或是使用过的对象保存到内存中(一个数据结构当中),这个数据结构通常是或类似于hashMap,当以后要使用某个对象时, 会先到缓存中去找有没有这个对象,如果有就使用缓存中的,如果没有就 到数据中去查询,并将查询出来的数据保存到缓存中,方便下次使用。即使用缓存会涉及到三个方面:把数据放入缓存,从缓存中读取缓存,删除无用的缓存。
一级缓存:
Hibernate的session是一种缓存,通常被称为hibernate的一级缓存。用session查询数据时,首先会从session内部去找有没有,有就使用session中的,没有就到数据库中去查,并将查到的结果放到session中,方便下次使用。由于session代表一次会话,与一个数据库连接相关联,所以session最好不要长时间保持打开,通常仅用于一个事务当中,事务关闭的时候就应该结束。另外,session是线程不安全的,当多线程共享使用时会出现问题。通常只有那种全局意义的缓存才是真正的缓存应用,才有大的缓存使用价值。二级缓存就能达到这个使用价值。Session级共享的: save, update, saveorupdate, list, get, load, iterate, lock这些方法都会放在一级缓存中。Session缓存的另一个缺点是不能控制缓存的数量,当大批量数据操作时会造成数据的溢出。但可以用evict, clear去清除缓存。
二级缓存:
它是独立于hibernate的一个软件部件,属于第三方产品,常用的第三方缓存产品有:EhCache, OsCache, TreeCache,SwarmCache。可以通过对org.hibernate.cache.EhCacheProvider和Cache接口来实现。二级缓存的配置: 首先,开启缓存,确定使用哪个产家的第三方产品,配置该缓存自己的配置文件,然后要配置hibernate中那些对象需要纳入二级缓存中,这就是这的配置思路。另处需要注意的是,一个二级缓存只能负责缓存一个数据库中的数据,否则就会造成与实际数据不相符。