面试的时候,经常会被问到Hibernate,而Hibernate的缓存问题又是被问到最多,我想在这上吃亏的人并不少,那么我就总结一下有关Hibernate的问题,希望和大家交流一下
缓存(Cache),往往是提高系统性能的重要手段。对数据起到一个蓄水池和缓冲的的作用。缓存对于大量依赖数据读取操作的系统而言尤为重要,在大并发量的情况下,如果每次程序都需要向数据库直接做查询操作,所带来的性能开销显而易见。频繁的网络传输、数据库磁盘的读写操作,这些都大大降低了系统的整体性能。此时,如果能把数据在本地内存中保留一个镜像,下次访问时只需从内存中直接获取,那么显然可以带来显著的性能提升。引入缓存机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将给系统带来难以预知的严重后果。虽然一个设计很好的应用程序不用缓存也可以表现出让人接受的性能,但毫无疑问,一些对读操作要求很高的应用程序可以通过缓存取得更高的性能。对于应用程序,缓存通过内存或磁盘保存了数据库的当前有关数据状态,它是一个存于当地的数据备份。缓存位于数据库和应用程序之间,从数据库更新数据,并给程序提供数据。
Hibernate的一级缓存是会话级缓存(Session-level),也就是常用到的Session,会话级缓存在给定的Session实例的生命周期内保存对象的实例。Session缓存类似于事务性缓存,只缓存给定的操作所需数据。二级缓存是应用级缓存(缓存服务).
Hibernate支持四种缓存服务,EHCache(Easy Hibernate Cache)是默认服务。要使用其他的缓存服务(二级缓存)需要在hibernate.cfg.xml中配置。例:
<propertyname="hibernate.cache.provider_class">
org.hibernate.cache.OSCacheProvider
</property>
Hibernate提供的缓存支持
EHCache (org.hibernate.cache.EhCacheProvider)
是一个简单,高效,使用简单的轻量级的缓存,它支持只读.读写.内存硬盘缓存。但并不支持分布式。
OSCache (org.hibernate.cache.OSCacheProvider)
另一个开源缓存解决方案,他一是一个更大计划的一个部分,这个部分就是为JSP或者任意对象提供。像EHCache一样也是强大和灵活的包。它支持只读.读写.内存硬盘缓存。它也提供基本的JavaGroup或者JMS的集群支持
SwarmCache (org.hibernate.cache.SwarmCacheProvider)
一个简单的基于JavaGroups集群基本解决方案,他支持只读或者非严格读写。更多的用于读炒作。
TreeCache (org.hibernate.cache.TreeCacheProvider)
JBOSS提供,一个强大的同步或非同步的事务缓存.
缓存插件 | transactional | read-write | nonstrict-read-write | read-only |
EhCache | 不支持 | 支持 | 支持 | 支持 |
SwarmCache | 不支持 | 不支持 | 支持 | 支持 |
TreeCache | 支持 | 不支持 | 不支持 | 支持 |
OSCache | 不支持 | 支持 | 支持 | 支持 |
缓存配置文件属性:
拷贝ehcache.xml文件到类路径下。ehcache.xml文件位于Hibernate安装目录etc下,拷贝这文件到项目工程的src目录下。
l <diskStore path=”java.io.tmpdir”/>:指定当把缓存中的数据写到硬盘上时,把数据写到这个项目上,”java.io.tmpdir”指定了java的一个临时目录,也可以使用自己定义的目录,如path=”C:\\temp”。
l defaultCache是默认的Cache设置。
l <cache name=”sampleCache1”>:name属性指定要使用缓存的类的完全路径名,或者要使用缓存的类的集合的完全路径名。例如要设定com.px1987.Course类使用第二级缓存,则可以设置name=” com.px1987.Course”。
l maxElementsInMemory=”10000”:设定缓存中允许的最大的对象个数。
l eternal=”false”:如果为true,则缓存中的对象永不多期,并且会忽略timeToldleSeconds选项和timeToLiveSeconds选项。如果为false,将根据timeToldleSeconds选项和timeToLiveSeconds选项设置对象过期策略。
l timeToldleSeconds=”120”:从对象在缓存中的空闲状态超过120秒后过期。这个选项以秒为单位,当对象从最后一次访问到现在的时间超过了此处设定的值,对象将过期,并从缓存中被清除掉。如果设置为0则表示永不过期。只有设置eternal=”false”后,这个选项才会有效。
l timeToLiveSeconds=”120”:从对象放到缓存中起,对象在120秒后将被从缓存中清除。timeToLiveSeconds设定对象在缓存中存活的最长时间,可见timeToLiveSeconds需大于timeToldleSeconds。
l overflowToDisk=”true”:当缓存中的对象个数超过maxElementsInMemory的上限后,溢出的对象将被写到磁盘。
来源MANING出版的<<Hibernate 快速开发>>总结