hibernate缓存笔记04055
缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域, 目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候 就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应 用程序对物理数据源的访问,使得程序的运行性能明显的提升. 缓存分两级,一级session缓存,就是常说的一级缓存;二级应用缓存(二级缓存); 一级缓存,一级缓存依赖于session,在一个session中就是一个缓存,当session失效时,缓存消失。 /*两个session两次加载*/ Java代码 1. public void loadBookAgain() 2. Session session = HibernateSessionFactory.getSession(); 3. Book book1 = (Book) session.get(Book.class, 6); 4. Book book2 = (Book) session.get(Book.class, 6); 5. session.close(); 6. 7. / Session session1 = HibernateSessionFactory.getSession(); 8. / Book book2 = (Book) session1.get(Book.class, 6); 9. / session1.close(); 10. public void loadBookAgain() Session session = HibernateSessionFactory.getSession(); Book book1 = (Book) session.get(Book.class, 6); Book book2 = (Book) session.get(Book.class, 6); session.close(); / Session session1 = HibernateSessionFactory.getSession();/ Book book2 = (Book) session1.get(Book.class, 6);/ session1.close(); 在一个session里面查询两次相同的book,只会执行一次sql。 但若放在不同的session中,将会执行两次数据库查询。 解决问题的办法就是用二级缓存。 二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等。 参考http:/www.javaeye.com/topic/249465 不是所有的数据都适合放在二级缓存中 下面这几种情况就不适合加载到二级缓存中: 1.经常被修改的数据 2.绝对不允许出现并发访问的数据 3.与其他应用共享的数据 下面这己种情况合适加载到二级缓存中: 1.数据更新频率低 2.允许偶尔出现并发问题的非重要数据 3.不会被并发访问的数据 4.常量数据 5.不会被第三方修改的数据 配置二级缓存比较简单,以ehcache为例: 添加缓存文件ehcache-hibernate-local.xml Java代码 1. <?xml version="1.0" encoding="UTF-8"?> 2. <ehcache> 3. 4. <diskStore path="java.io.tmpdir/hibernate/book" /> 5. <defaultCache maxElementsInMemory="10000" overflowToDisk="true" eternal="false" 6. memoryStoreEvictionPolicy="LRU" maxElementsOnDisk="10000000" 7. diskExpiryThreadIntervalSeconds="600" 8. timeToIdleSeconds="3600" timeToLiveSeconds="100000" diskPersistent="false" /> 9. <!- Special objects setting. -> 10. <cache name="bean.entity.Book" maxElementsInMemory="500" overflowToDisk="true" 11. eternal="true"> 12. </cache> 13. </ehcache> <?xml version="1.0" encoding="UTF-8"?><ehcache> <diskStore path="java.io.tmpdir/hibernate/book" /> <defaultCache maxElementsInMemory="10000" overflowToDisk="true" eternal="false" memoryStoreEvictionPolicy="LRU" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="600" timeToIdleSeconds="3600" timeToLiveSeconds="100000" diskPersistent="false" /> <!- Special objects setting. -> <cache name="bean.entity.Book" maxElementsInMemory="500" overflowToDisk="true" eternal="true"> </cache></ehcache> maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期, timeToIdleSeconds对象处于空闲状态的最多秒数, timeToLiveSeconds对象处于缓存状态的最多秒数 。 在实体bean的hbm.xml文件中加上缓存配置: Java代码 1. <!- 设置该持久化类的二级缓存并发访问策略 read-only read-write 2. nonstrict-read-write transactional-> 3. <cache usage="read-write" /> <!- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-> <cache usage="read-write" /> 现在大部分的hibernate应用不再写实体映射配置文件,那么就在实体bean中加上 /默认的缓存策略. Java代码 1. Cache(usage = CacheConcurrencyStrategy.READ_WRITE) Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 在hibernate定义sessionFactory中加上查询缓存配置: <!- 设置二级缓存插件EHCache的Provider类-> Java代码 1. <property name="hibernate.cache.provider_class"> 2. org.hibernate.cache.EhCacheProvider 3. </property> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!- 启动"查询缓存" -> Java代码 1. <property name="hibernate.cache.use_query_cache">true</property> 2. <property 3. name="hibernate.cache.provider_configuration_file_resource_path"> 4. /ehcache-hibernate-local.xml 5. </property> <property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.cache.provider_configuration_file_resource_path"> /ehcache-hibernate-local.xml </property> 如果项目试用了spring,那么相应配置为: Java代码 1. <property name="hibernateProperties"> 2. <props> 3. <prop key="hibernate.dialect">$hibernate.dialect</prop> 4. <prop key="hibernate.show_sql">$hibernate.show_sql</prop> 5. <prop key="hibernate.format_sql">$hibernate.format_sql</prop> 6. <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 7. <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate-local.xml</prop> 8. </props> 9. </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">$hibernate.dialect</prop> <prop key="hibernate.show_sql">$hibernate.show_sql</prop> <prop key="hibernate.format_sql">$hibernate.format_sql</prop> <prop key="hibernate.cache.provider