Hibernate提供了一级缓存和二级缓存,合理的利用缓存可以有助于提高系统的性能,为了避免不合理的利用缓存导致内存过度消耗降低系统性能,可以通过合理配置缓存的参数来避免这个问题。
缓存的目的是为了通过减少应用程序对物理数据访问的次数来提高程序运行的效率,原理则是把当前或接下来一段时间有可能会用到的数据保存到内存中,在使用时直接从内存中读取,而不是从硬盘上读取,简单说,缓存就是数据库中的数据在内存中的“临时容器”。
Hibernate中的一级缓存由Session管理,二级缓存由SessionFactory来管理。在使用时,二级缓存是可有可无的,但一级缓存是必不可少的。
一级缓存的使用场合:当使用Session查询数据时,首先会在Session内部查找该对象是否存在,若存在,则直接返回,否则,就到数据库中查询,并将查询到的结果缓存起来以便后期使用。一级缓存的缺点就是当使用Session来表示一次会话时,它的生命周期较短,而且它不是线程安全的,不能被多个线程共享,因此,在实际使用时,对效率的提升不是非常明显。
鉴于以上原因,引入二级缓存的概念。二级缓存用来为Hibernate配置一种全局的缓存,以便实现多个线程与实务共享。在使用了二级缓存机制后,当查询数据时,会首先在内存缓存中查找,如果不存在,接着在二级缓存中查找,最后才去数据库中查找。与一级缓存相比,二级缓存还是独立于Hibernate的软件部件,属于第三方的产品,常见的产品有EhCache、OSCache、JbossCache等。Hibernate3默认使用的产品是EhCache。在使用时,可以根据需求通过配置缓存插件实现二级缓存功能,Hibernate为了集成这些插件,提供了org.hibernate.cache.CacheProvider接口来充当缓存插件与Hibernate之间的适配器。当然,二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。
二级缓存适合的几种情况:
数据量较小。(数据量太大会消耗大量内存,造成内存资源紧张,降低系统性能)
对数据的修改较少。(会造成频繁对缓存中的数据进行同步,影响系统的性能)
不会被大量的应用共享的数据。(数据被大量线程或事务共享,多线程访问的同步机制会影响系统性能)
不是很重要的数据。(如果要查询的数据对正确性要求较高,如财务,最好不要使用二级缓存)