`
nintenyun
  • 浏览: 27341 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate 查询缓存示意

阅读更多
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import org.hibernate.CacheMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import junit.framework.TestCase;

public class CacheLevel2Test extends TestCase {

	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启一个session,分别调用query.list
	 */
	public void testCache1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			List names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			
			System.out.println("-------------------------------------");
			query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//没有发出查询sql,因为启用了查询缓存
			names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}

			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list
	 */
	public void testCache2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			List names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//不会发出查询sql,因为查询缓存的生命周期和session无关
			List names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.iterate
	 */
	public void testCache3() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			 
			for (Iterator iter=query.iterate();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			 
			//查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用
			//查询缓存
			for (Iterator iter=query.iterate();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	/**
	 * 关闭查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache4() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			//query.setCacheable(true);
			
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			//query.setCacheable(true);
			//会发出查询sql,因为list默认每次都会发出查询sql
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		

	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache5() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id
			//所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的
			//实体那么将发出根据实体id查询的sql语句,否则不会发出sql使用缓存中的数据
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	/**
	 * 开启查询缓存,开启二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache6() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表
			//hibernate会根据实体对象的id列表到二级缓存中取得相应的数据
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}
 
分享到:
评论

相关推荐

    什么是hibernate.doc

    此外,Hibernate还包含了数据查询和缓存功能,通过缓存机制减少对数据库的直接访问,提高系统性能。 在Hibernate的位置示意图中,我们可以看到它作为一个独立的中间件层,位于Java应用程序和数据库系统之间,负责...

    管理系统中-配置sql 数据库-示意图-详解

    8. **性能优化**:配置索引以加速查询,合理设置缓存策略以减少对数据库的频繁访问,监控和调整数据库的性能参数,如内存使用、并发连接数等,确保数据库能够高效运行。 9. **备份与恢复**:定期备份数据库以防数据...

    java面试题

    #### 十六、Hibernate缓存 **题目**: 谈一谈Hibernate的一级缓存、二级缓存和查询缓存。 **解答**: - **一级缓存**:也称为Session缓存,是默认启用的,用于缓存同一Session内获取的数据。 - **二级缓存**:用于跨...

    Java框架面试题总结

    - **一级缓存**:Session级别的缓存,由Hibernate自动管理。 - **二级缓存**:Application级别的缓存,需要手动配置。 **6. 什么样的数据适合放到二级缓存中?** - 经常被多个Session访问的数据。 - 数据更新频率...

    ssh 框架技术

    - **高性能**:提供了缓存机制,减少了数据库交互次数。 ##### 9. 版本历史 - **发展历程**:从Hibernate 1.x到最新的版本,不断改进和完善。 ##### 10. 第一个Hibernate程序 - **环境搭建**:安装Java环境,...

    android 上传和下载图片

    最后,为了优化用户体验,可以考虑使用缓存机制,如使用内存缓存(LruCache)和磁盘缓存(DiskLruCache)。这可以减少不必要的网络请求,提高加载速度。 以上就是Android中图片上传和下载的基本步骤,包括选择图片...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

Global site tag (gtag.js) - Google Analytics