`

Hibernate 缓存问题

阅读更多

什么是缓存??

     答:缓存就是在内存中开辟一块空间,把本来要存放的数据放在此内存中,将来要用的时候直接去内存中取出来用。

什么是一级缓存???

     答:一级缓存也就是session缓存。   一个session是不可以访问其他session的,这就会导致出一个问题,当多线程访问同一数据的时候,在不做二级缓存的情况下,每个线程都要开一个session,也就是每一个session都要发出一个sql语句,这时对性能很不好,处理的办法就是开启二级缓存。

什么是二级缓存???

     答:二级缓存也就是SessionFactory级别的缓存,可以越过session的存在。。。。什么时候用:  数据改动不平凡, 数据量不大,  常常被访问。

 

打开二级缓存的步骤:

  1. 设定hibernate.cfg.xml文件
    <!-- 使用二级缓存 -->
            <property name="hibernate.cache.use_second_level_cache">true</property>
            <property name="hibernate.cache.provider_class">
            	org.hibernate.cache.EhCacheProvider
            </property> 
     

  2. @Cache注解
    package com.lbx.model;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    import org.hibernate.annotations.BatchSize;
    import org.hibernate.annotations.Cache;
    import org.hibernate.annotations.CacheConcurrencyStrategy;
    
    @Entity
    //@BatchSize(size=2)
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    public class Category {
    	
    	private int id;
    	private String name;
    	
    	@Id
    	@GeneratedValue
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    }
    
     

  3. 测试代码
    package com.lbx.model.test;
    
    
    import java.util.List;
    
    import junit.framework.TestCase;
    
    import org.hibernate.Session;
    import org.hibernate.lucene.Text;
    
    import com.lbx.hibernate.Util.HibUtil;
    import com.lbx.model.Category;
    import com.lbx.model.Topic;
    
    public class Test extends TestCase {
    	
    	
    	// 测试缓存问题(session级缓存)
    	@Text
    	public void testCache01(){
    		Session session = HibUtil.getSession();
    		session.beginTransaction();
    		
    		//同一个session
    		Topic t1 = (Topic)session.load(Topic.class, 1);
    		System.out.println(t1.getTitle());
    		
    		Topic t2 = (Topic)session.load(Topic.class, 1);
    		System.out.println(t2.getTitle());
    		
    		session.beginTransaction().commit();
    		session.close();
    	}
    	
    	@Text
    	public void testCache02(){
    		Session session = HibUtil.getSession();
    		session.beginTransaction();
    		
    		Topic t1 = (Topic)session.load(Topic.class, 1);
    		System.out.println(t1.getTitle());
    		
    		session.beginTransaction().commit();
    		session.close();
    		
    		//一个session是不能访问其他session的
    		Session session2 = HibUtil.getSession();
    		session2.beginTransaction();
    		
    		Topic t2 = (Topic)session2.load(Topic.class, 1);
    		System.out.println(t2.getTitle());
    		
    		session2.beginTransaction().commit();
    		session2.close();
    	}
    	
    	//测试二级缓存
    	@Text
    	public void testCache03(){
    		Session session = HibUtil.getSession();
    		session.beginTransaction();
    		
    		Category t1 = (Category)session.load(Category.class, 9);
    		System.out.println(t1.getName());
    		
    		session.beginTransaction().commit();
    		session.close();
    		
    		//一个session是不能访问其他session的
    		Session session2 = HibUtil.getSession();
    		session2.beginTransaction();
    		
    		Category t2 = (Category)session2.load(Category.class, 9);
    		System.out.println(t2.getName());
    		
    		session2.beginTransaction().commit();
    		session2.close();
    	}
    	
    	//测试查询缓存(都只发一条sql语句)
    	@Text
    	public void testCache04(){
    		Session session = HibUtil.getSession();
    		session.beginTransaction();
    		
    		List<Category> lists1 = session.createQuery("from Category").setCacheable(true).list();
    		List<Category> lists2 = session.createQuery("from Category").setCacheable(true).list();
    		
    		session.beginTransaction().commit();
    		session.close();
    		
    		Session session2 = HibUtil.getSession();
    		session2.beginTransaction();
    		
    		List<Category> lists3 = session2.createQuery("from Category").setCacheable(true).list();
    		List<Category> lists4 = session2.createQuery("from Category").setCacheable(true).list();
    		
    		session2.beginTransaction().commit();
    		session2.close();
    		
    	}
    	
    }
    
     

注意:load默认是使用session缓存,iterate也是的,   list默认是往二级缓存中加数据,但是查询的时候就不使用

重点:性能问题,先要考虑到本地内存取数据,不行再到本地硬盘读数据,再不行就到远程数据库中去读数据

 

 

分享到:
评论

相关推荐

    Hibernate缓存深入详解 from ITEye

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

    Hibernate缓存.doc

    Hibernate缓存.docHibernate缓存.doc

    Hibernate缓存技术研究

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

    Java Hibernate缓存深入详解

    Java Hibernate缓存深入详解

    hibernate缓存机制

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

    Hibernate缓存,性能优化

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

    Hibernate缓存深入详解

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

    hibernate缓存深入详解.

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

    Hibernate缓存与spring事务详解

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

    hibernate缓存和事务

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

    hibernate缓存

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

    Hibernate缓存策略

    Hibernate缓存原理及调优策略 Hibernate缓存原理调优策略

    Hibernate缓存详解

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

    hibernate缓存的问题

    Hibernate 缓存是提高应用程序性能的关键机制,它分为一级缓存和二级缓存。一级缓存是 Hibernate Session 内部的缓存,它是默认开启且不可卸载的,主要用于保持 Session 内部数据状态同步。由于 Session 生命周期较...

    hibernate缓存ehcache用法

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

    Hibernate教程25_Hibernate缓存

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

    hibernate缓存深入详解

    hibernate缓存深入详解

Global site tag (gtag.js) - Google Analytics