`

Hiberante(九) 二级缓存(自己加入缓存)

 
阅读更多

 

使用二级缓存的步骤
		1、hibernate并没有提供相应的二级缓存的组件,所以需要加入额外的二级缓存包,常用的二级缓存包是ECHcache
		2、在hibernate.cfg.xml中配置开启二级缓存
		<!-- 设置二级缓存为true -->
				<property name="hibernate.cache.use_second_level_cache">true</property>
				<!-- 设置二级缓存所提供的类 -->
				<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
				<!-- 在hibernate4.0之后需要设置facotory_class -->
				<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
		3、设置相应的ehcache.xml文件,在这个文件中配置二级缓存的参数,并且将文件在cfg文件中配置
		<!-- 说明ehcache的配置文件路径 -->
				<property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
		4、开启二级缓存
			在xml的配置中设置
			<cache usage="read-only"/>
		5、二级缓存缓存的是对象,它是把所有的对象缓存到内存中,一定注意是基于对象的缓存
		
		6、查询缓存是针对HQL语句的缓存,查询缓存仅仅只会缓存id而不会缓存对象

  

@Test
	public void test01() {
		Session session = null;
		try {
			/**
			 * 此时会发出一条sql取出所有的学生信息
			 */
			session = HibernateUtil.openSession();
			Student stu = (Student)session.load(Student.class, 1);
			System.out.println(stu.getName()+",---");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			/**
			 *此时session已经关闭了,但是Student在二级缓存中,所以也不会发出SQL语句
			 */
			Student stu = (Student)session.load(Student.class, 1);
			//会报错,因为二级缓存设置为read-only
//			stu.setName("abc");
			System.out.println(stu.getName()+",---");
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	
	@Test
	public void test03() {
		Session session = null;
		try {
			/**
			 * 此时会发出一条sql取出所有的学生信息
			 */
			session = HibernateUtil.openSession();
			List<Student> ls = session.createQuery("from Student")
					.setFirstResult(0).setMaxResults(50).list();
			Iterator<Student> stus = ls.iterator();
			for(;stus.hasNext();) {
				Student stu = stus.next();
				System.out.println(stu.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
		
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			/**
			 *此时session已经关闭了,但是Student在二级缓存中,所以也不会发出SQL语句
			 */
			Student stu = (Student)session.load(Student.class, 1);
			//会报错,因为二级缓存设置为read-only
//			stu.setName("abc");
			System.out.println(stu.getName()+",---");
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void test04() {
		Session session = null;
		try {
			/**
			 * 此时会发出一条sql取出所有的学生信息
			 */
			session = HibernateUtil.openSession();
			List<Object[]> ls = session.createQuery("select stu.id,stu.name from Student stu")
					.setFirstResult(0).setMaxResults(50).list();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
		
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			/**
			 *以上代码仅仅取了id和name,而二级缓存是缓存对象的,所以上一段代码不会将对象加入二级缓存
			 *此时就是发出相应的sql
			 */
			Student stu = (Student)session.load(Student.class, 1);
			//会报错,因为二级缓存设置为read-only
//			stu.setName("abc");
			System.out.println(stu.getName()+",---");
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void test05() {
		Session session = null;
		try {
			/**
			 * 此时会发出一条sql取出所有的学生信息
			 */
			session = HibernateUtil.openSession();
			List<Object[]> ls = session.createQuery("select stu from Student stu")
					.setFirstResult(0).setMaxResults(50).list();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
		
		try {
			session = HibernateUtil.openSession();
			/**
			 * 由于学生的对象已经缓存在二级缓存中了,此时再使用iterate来获取对象的时候,首先会通过一条
			 * 取id的语句,然后在获取对象时去二级缓存中,如果发现就不会再发SQL,这样也就解决了N+1问题
			 * 而且内存占用也不多
			 */
			Iterator<Student> stus = session.createQuery("from Student")
					.setFirstResult(0).setMaxResults(50).iterate();
			for(;stus.hasNext();) {
				Student stu = stus.next();
				System.out.println(stu.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
	}
	
	@Test
	public void test06() {
		Session session = null;
		try {
			/**
			 * 此时会发出一条sql取出所有的学生信息
			 */
			session = HibernateUtil.openSession();
			List<Object[]> ls = session.createQuery("select stu from Student stu")
					.setFirstResult(0).setMaxResults(50).list();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
		
		try {
			session = HibernateUtil.openSession();
			/**
			 * 使用List会发出两条一模一样的sql,此时如果希望不发sql就需要使用查询缓存
			 */
			List<Student> ls = session.createQuery("select stu from Student stu")
					.setFirstResult(0).setMaxResults(50).list();
			Iterator<Student> stus = ls.iterator();
			for(;stus.hasNext();) {
				Student stu = stus.next();
				System.out.println(stu.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			HibernateUtil.close(session);
		}
	}
	

 

分享到:
评论

相关推荐

    Hiberante3相关文档

    “Hibernate3_缓存机制”意味着这部分内容将深入探讨Hibernate如何通过缓存提高性能,包括第一级缓存和第二级缓存的概念,以及它们的工作原理。 “Hibernate3_数据加载”则可能涵盖Hibernate的数据检索策略,如懒...

    hiberante 源码 配置资料

    4. 缓存配置:Hibernate提供了一级缓存和二级缓存,一级缓存是Session级别的,而二级缓存可以通过第三方插件如Ehcache进行配置,提高数据访问性能。 5. SessionFactory初始化:通过`Configuration`类加载配置信息并...

    hiberante4.2.3-part01

    5. **缓存机制**:Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存默认开启,能提高性能,减少对数据库的访问。二级缓存则可以通过插件如Ehcache实现,可以跨会话共享...

    hiberante5基础讲义

    二级缓存则是SessionFactory级别的,可跨会话共享,通常需要配合第三方缓存实现,如Ehcache。Hibernate还支持查询缓存,将已执行过的查询结果缓存起来,避免重复执行相同的SQL。 六、其他特性 除了上述内容,...

    hiberante中文帮助文档

    8. **缓存机制**:Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),能够提高数据访问速度并减少数据库压力。 9. **关联映射**: Hibernate支持一对一、一对多、多对一和多对多...

    Hiberante lib

    通过实践,可以深入理解Hibernate如何将Java对象与数据库记录关联,以及如何优化性能,如使用二级缓存和批处理等技术。 总的来说,“Hiberante lib”压缩包提供了搭建和学习Hibernate环境的基础组件,对于想要进入...

    hiberante ref document

    Hibernate提供了缓存策略,包括第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),以及查询缓存。合理利用缓存可以显著提升应用性能。 八、事务管理 Hibernate支持JTA和JDBC事务管理,...

    hiberante 学习PDF

    Hibernate 提供了两级缓存:一级缓存(session 缓存)和二级缓存(全局缓存)。合理使用缓存可以显著提高应用程序的性能。 #### 映射策略 - **一对一、一对多、多对一和多对多**:Hibernate 支持各种复杂的关系...

    疯狂Ajax讲义5+Spring+hiberante

    5. **缓存机制**:Hibernate支持二级缓存,可以提高数据读取效率,减少对数据库的访问。 综上所述,这个压缩包中的内容可能涵盖了Web开发中Ajax的使用,Spring框架的配置与应用,以及如何利用Hibernate进行数据库...

    疯狂Ajax讲义+Spring+hiberante

    4. **缓存机制**:Hibernate支持一级缓存(Session缓存)和二级缓存(可选),以提高数据访问性能。 5. **事务管理**:Hibernate整合了JTA(Java Transaction API)和JPA(Java Persistence API)的事务处理,确保...

    Hiberante读取BLOB数据类型.

    - 缓存策略:根据业务需求,选择合适的缓存策略,比如第二级缓存,以减少对数据库的访问。 - 分批读取和写入:如果数据量非常大,可以考虑分批读取和写入,避免一次性处理所有数据。 5. **事务管理** 操作BLOB...

    hiberante in action

    7. **缓存机制**:Hibernate支持二级缓存和查询缓存,可以提高数据访问速度,减少数据库负载。理解何时和如何使用缓存可以显著提升系统性能。 8. **事务管理**:Hibernate支持JTA和JDBC两种事务管理方式,理解事务...

    hiberante annotations reference_cn

    Hibernate提供了二级缓存机制,可以提高数据读取效率。此外,还有懒加载(Lazy Loading)、批处理(Batch Processing)、缓存策略等优化手段,以降低数据库访问压力。 8. **其他高级特性** Hibernate还支持实体的...

    hiberante3.2源码

    在 Hibernate 3.2 中,一级缓存(Session 缓存)默认开启,而二级缓存可以通过插件实现,如 Ehcache,它可以跨多个 Session 工作,提高数据读取速度。 6. **事件和监听器**:Hibernate 提供了事件驱动的机制,允许...

    hiberante基础介绍

    尽管 Hibernate 在未优化的情况下可能性能不佳,但通过使用缓存策略(如一级缓存、二级缓存)和查询优化,可以显著提升其性能。 **入门 Hibernate** 要开始使用 Hibernate,首先需要下载 Hibernate 的开发包,如 ...

    Struts+Hiberante论坛系统,提供完整包

    - **缓存机制**:Hibernate支持一级缓存(Session级别)和二级缓存(SessionFactory级别),能有效提升性能。 3. **论坛系统架构**: - **用户模块**:包括用户注册、登录、个人信息管理等功能,通常会涉及User...

    hibernate-release-5.1.16.Final.zip

    Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存默认开启,可以减少数据库访问;二级缓存则需要配合第三方缓存框架如Ehcache,可进一步提高性能。 七、事务管理 ...

    hibernate3.2生命周期

    二级缓存是可选的,可以跨多个Session共享,但需要配置和管理。 ### 6. 源码分析 深入源码可以帮助我们理解Hibernate如何处理对象的生命周期。例如,`save()`、`persist()`、`update()`、`merge()`等方法的实现,...

    job4j_hiberante:课程作业4。 学习Hibernate

    8. **缓存机制**:第一级缓存(Session缓存)和第二级缓存(SessionFactory缓存)的概念和配置。 9. **事务管理**:在Hibernate中使用Transaction进行事务控制,确保数据的一致性。 10. **实体关系映射策略**:了解...

Global site tag (gtag.js) - Google Analytics