`
啸笑天
  • 浏览: 3461065 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Hibernate缓存

阅读更多

 

缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。

一级缓存,Session级共享。

save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。

随着sesssion的关闭session缓存就关闭了

看到hqlsql语句就不能从一级缓存中取,例如Query

-------------------------------------------------------------------------------------------------------

二级缓存,SessionFactory级共享。

·实现为可插拔,通过修改cache.provider_class参数来改变;

hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持可以通过实现CacheProviderCache接口来加入Hibernate不支持的缓存实现。

·hibernate.cfg.xml中加入:

<class-cache class="className" usage="read-only"/>

或在映射文件的class元素加入子元素:

<cache usage="read-write"/>

其中usage:

read-only只读 

read-write严格读写,多线程时会做同步 

nonstrict-read-write不严格的读写 

Transactional事务性缓存 

·Session的save(这个方法不适合native生成方式的主键),

update,saveOrUpdate,list,iterator,get,load,以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时)Sessioniterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)

·Query,Criteria(查询缓存)由于命中率较低,所以hibernate默认是关闭;修改cache.use_query_cachetrue打开对查询的缓存,并且调用query.setCacheable(true)criteria.setCacheable(true)

·SessionFactory中提供了evictXXX()方法用来清除缓存中的内容。例:HibernateUtil.getSessionFactory().evict(User.class);

·统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计信息。

 

例子:

Hibernate采用第三方缓存控制,我们使用oscache来演示首先需要加入oscache2.1.jar这个库文件,在Hibernate3.3.2lib文件夹下的optional文件夹内。

另外需要加入oscache的配置文件,在Hibernate3.3.2/porject/etc下找到oscache.proprities文件,黏贴到工程src目录下即可

我用的是Hibernate3.3.2,还需要加载common-logging-1.1.jar这个库,因为oscache使用的日志框架是common-logging

添加完以后我们修改hibernate.cfg.xml配置文件:加入

<!-- 二级缓存 -->  
<property name="cache_user_second_level_cache">true</property>  <!-- 使用二级缓存 -->  
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property> <!--使用oscache-->

另外我们还需要指定哪些类需要采用缓存机制,以Users为例

修改Users.hbm.xml配置(还可以在hibernate.cfg.xml配置:<class-cache class="domain.Users(全类名)" usage="read-only"/>

 

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="domain">  
    <class name="Users">  
        <cache usage="read-write"/>  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="name"></property>  
        <property name="birthday"></property>         
    </class>  
</hibernate-mapping>  

 

下面输出一下oscache的统计信息看看,即cache的命中率,当然打开统计信息消耗不少的资源(开发测试时可能要看)

hibernate.cfg.xml中加入

<!-- 打开二级缓存统计信息 -->
<property name="generate_statistics">true</property>  

 

程序代码中:

 Statistics st = HibernateUtil.getSessionFactory().getStatistics();
 System.out.println(st);
System.out.println("put:" + st.getSecondLevelCachePutCount());//加入二级缓存次数
System.out.println("hit:" + st.getSecondLevelCacheHitCount());//命中次数
System.out.println("miss:" + st.getSecondLevelCacheMissCount());//没有命中次数
 

 

 

-------------------------------------------------------------------------------------------------------------

·分布式缓存和中央缓存。

大型的系统往往是一台数据库,多台web服务器,那么如何协调好多台web服务器上的缓存同步就会存在很大的问题。

比如u1 u2 两个用户分别访问w1 w2 两台服务器,同时读取了user对象信息,那么两台服务器上的数据就会分别保存在w1 w2的缓存上,如果u1更新了user的信息,那么w2的缓存依然还是没更新前的数据,u2读到的数据不是正确的数据。

这种分布式缓存对更新的成本比较高

另外是把缓存独立出来,w1 w2共用一台缓存服务器(中央缓存),那么更新方面的问题是解决了,但是读取数据的开销也大了,不再是本地缓存读取,需要连接缓存服务器读取了。

·使用缓存的条件

1.读取大于修改。

2.数据量不能超过内存容量。

3.对数据要有独享的控制。

4.可以容忍出现无效数据。

分享到:
评论

相关推荐

    Hibernate缓存深入详解 from ITEye

    **Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...

    Hibernate缓存技术研究

    ### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...

    Hibernate缓存.doc

    Hibernate缓存.docHibernate缓存.doc

    Java Hibernate缓存深入详解

    Java Hibernate缓存深入详解

    hibernate缓存

    ### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    hibernate缓存深入详解.

    关于hibernate缓存的一个ppt课件,60+幻灯片,有需要的可以看一下

    Hibernate缓存深入详解

    【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...

    Hibernate缓存详解

    **Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...

    Hibernate缓存,性能优化

    本文将深入探讨Hibernate缓存的原理、类型及其对性能优化的影响。 ### Hibernate缓存原理 Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动...

    hibernate缓存和事务

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。

    Hibernate教程25_Hibernate缓存

    **标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...

    Hibernate缓存管理.doc

    【Hibernate缓存管理】是数据库持久化框架Hibernate中优化性能的关键技术。缓存的主要目的是减少对数据库的直接访问,提高应用程序的运行效率。缓存的数据是数据库中数据的副本,存在于内存或硬盘中,便于快速读取。...

    hibernate缓存ehcache用法

    这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...

    hibernate 缓存

    【Hibernate缓存详解】 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是提升系统性能的关键所在。本篇将深入探讨Hibernate的缓存机制,包括一级缓存和二级...

Global site tag (gtag.js) - Google Analytics