`

Hibernate学习之二级缓存

阅读更多

为什么需要二级缓存?
因为一级缓存有限(生命周期短),所以我们需要二级缓存(SessionFactory缓存)来弥补这个问题
需要配置
二级缓存是交给第三方去处理,常见的Hashtable , OSCache , EHCache
二级缓存的对象可能放在内存,也可能放在磁盘.

在*.hbm.xml文件中加入使用二级缓存的策略:
<cache usage="read-write"/>
也可以直接在hibernate.cfg.xml配置:
<class-cache class="cn.cz.domain.Users" usage="read-only" />

案例:
使用OsCache 来演示二级缓存的使用.
配置二级缓存
对配置说明:
<property name="hbm2ddl.auto">update</property>
    <!-- 启动二级缓存 -->
    <property name="cache.use_second_level_cache">true</property>
    <!-- 指定使用哪种二级缓存 -->
    <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
    <mapping resource="com/cz/domain/Department.hbm.xml" />
    <mapping resource="com/cz/domain/Student.hbm.xml" />
    <!-- 指定哪个domain启用二级缓存
    特别说明二级缓存策略:
    hibernate二级缓存策略
    只读缓存(read-only)
    读写缓存(read-write) [ 银行,财务软件]
     不严格读写缓存(nonstrict-read-write)  [bbs 被浏览多少次]
    事务缓存(transactional)
    -->
    <class-cache class="com.hsp.domain.Student" usage="read-write"/>

oscache.properties 文件放在 src目录下,这样你可以指定放入二级缓存的对象capacity 大小. 默认1000

如果报错还要再引入Hibernate的log4j.jar


使用:
        //通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml)
        Session s=null;
        Transaction tx=null;
       
        try {
            //使用基础模板
            s=HibernateUtil.openSession();
            tx=s.beginTransaction();
           
            //查询45号学生
       
            Student stu1=(Student) s.get(Student.class, 45);//45->一级缓存       
            System.out.println(stu1.getName());
           
           
            tx.commit();
           
        } catch (Exception e) {
            e.printStackTrace();
            if(tx!=null){
                tx.rollback();
            }
        }finally{
           
            if(s!=null && s.isOpen()){
                s.close();
            }
        }
       
        System.out.println("*********************************");
        try {
            //使用基础模板
            s=HibernateUtil.openSession();
            tx=s.beginTransaction();
           
            //查询45号学生
       
            Student stu1=(Student) s.get(Student.class, 45);   
            System.out.println(stu1.getName());
           
            Student stu3=(Student) s.get(Student.class, 46);   
            System.out.println(stu3.getName());
                tx.commit();
           
        } catch (Exception e) {
            e.printStackTrace();
            if(tx!=null){
                tx.rollback();
            }
        }finally{
           
            if(s!=null && s.isOpen()){
                s.close();
            }
        }
       
        //完成一个统计,统计的信息在Sessfactory
        //获取SessionFactory对象.
        Statistics statistics= HibernateUtil.getSessionFactory().getStatistics();
        System.out.println(statistics);
        System.out.println("放入"+statistics.getSecondLevelCachePutCount());
        System.out.println("命中"+statistics.getSecondLevelCacheHitCount());
        System.out.println("错过"+statistics.getSecondLevelCacheMissCount());

在配置了二级缓存后,要注意可以通过 Statistics,查看你的配置命中率高不高

 

HibernateUtil.java:

package com.sina.util;
import java.util.List;



import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil {
	private static SessionFactory sessionFactory=null;
	//使用线程局部模式
	private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
	private HibernateUtil(){};
	static {
		sessionFactory=new Configuration().configure().buildSessionFactory();
	}

        //获取SessionFactory
        public static SessionFactory getSessionFactory(){
                 return SessionFactory;
        }

 
       //获取全新的全新的sesession
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	//获取和线程关联的session
	public static Session getCurrentSession(){
		
		Session session=threadLocal.get();
		//判断是否得到
		if(session==null){
			session=sessionFactory.openSession();
			//把session对象设置到 threadLocal,相当于该session已经和线程绑定
			threadLocal.set(session);
		}
		return session;		
	}
	
	public static void closeCurrentSession(){
		
		Session s=getCurrentSession();
		
		if(s!=null&& s.isOpen() ){
			s.close();
			threadLocal.set(null);
		}
	}
}
分享到:
评论

相关推荐

    hibernate一级缓存和二级缓存的区别与联系

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

    Spring集成的Hibernate配置二级缓存

    以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml &lt;property name="hibernate.cache.use_...

    为Spring集成的Hibernate配置二级缓存

    2. **配置Hibernate**:在Hibernate的配置文件`hibernate.cfg.xml`中启用二级缓存并指定缓存提供商。以下是一个使用Ehcache的示例: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true ...

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    hibernate5.1二级缓存包

    这个"hibernate5.1二级缓存包"应该包含了用于实现二级缓存的相关组件和配置。 二级缓存是相对于一级缓存(Session 缓存)而言的,一级缓存是每个 Hibernate Session 内部的缓存,而二级缓存则是在 SessionFactory ...

    hibernate开启二级缓存和查询缓存

    在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...

    Hibernate4二级缓存实例(源码)

    这里它被用作Hibernate二级缓存的实现方式,这意味着当数据首次从数据库中读取后,会被存储在memcached中,后续请求可以直接从缓存中获取,避免了频繁的数据库交互,从而提高了系统的响应速度。 **知识点详解:** ...

    hibernate4配置二级缓存

    在Java的持久化框架Hibernate4中,二级缓存是一个重要的性能优化工具,它能够显著提升数据访问速度,减少对数据库的直接操作。二级缓存主要分为查询缓存和集合缓存,通过缓存中间结果,避免了多次重复的数据库查询。...

    hibernate 二级缓存详解

    Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...

    hibernate4.0使用二级缓存jar包

    ehcache 二级缓存 配置使用的jar包 配置如下: &lt;!-- 启用二级缓存 --&gt; &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;!-- 查询的二级缓存配置 --&gt; &lt;property name="hibernate....

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    学习和掌握Hibernate的二级缓存机制对于优化大型应用的性能至关重要。通过合理配置和使用,可以在不牺牲数据一致性的情况下,大幅度减少对数据库的访问,提高系统响应速度。在实际项目中,可以根据业务需求和系统...

    hibernate二级缓存示例源码

    综上所述,通过学习`hibernate二级缓存示例源码`,我们可以了解到如何在实际项目中配置和使用Hibernate二级缓存,从而提升系统的性能。在实际应用中,应结合具体场景选择合适的缓存策略,以达到最佳的性能优化效果。

    Hibernate一级缓存和二级缓存

    **二、Hibernate二级缓存** 二级缓存是SessionFactory级别的,跨越了多个Session,可以被多个线程共享。它通常由第三方插件如EhCache、Infinispan等提供。二级缓存分为以下几种类型: 1. **集合缓存**:用于存储...

    hibernate二级缓存

    Hibernate 二级缓存是一种高效的数据存储机制,它能够显著提升Web应用的性能,尤其是在处理大量数据流动时。缓存的主要目标是减少应用与数据库之间的交互次数,从而降低延迟并减轻数据库服务器的压力。在Hibernate...

    Hibernate 二级缓存 总结整理

    **Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的直接访问。当相同的数据再次被请求时,可以从缓存中快速获取,提高系统响应速度。在不使用缓存的情况下,可以通过配置关闭。 5...

Global site tag (gtag.js) - Google Analytics