Hibernate_一级缓存_Demo
来源:互联网 发布:php留言板视频教程 编辑:程序博客网 时间:2024/05/01 01:17
package org.zttc.itat.test;import java.util.Iterator;import java.util.List;import org.hibernate.Session;import org.junit.Test;import org.zttc.itat.model2.Student;import org.zttc.itat.util.HibernateUtil;@SuppressWarnings("unchecked")public class TestCache {@Testpublic void test01() {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());}/** * id=1的Student对象已经在session的缓存(一级缓存)中,此时就不会发sql去取Student */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已经关闭,此时又得重新取Student */Student stu = (Student)session.load(Student.class, 1);System.out.println(stu.getName()+",---");} catch (Exception e) {e.printStackTrace();} finally {HibernateUtil.close(session);}}@Testpublic void test02() {Session session = null;try {/** * 如果使用iterator方法返回列表,对于hibernate而言,它仅仅只是发出取id列表的sql * 在查询相应的具体的某个学生信息时,会发出相应的SQL去取学生信息 * 这就是典型的N+1问题 * 存在iterator的原因是,有可能会在一个session中查询两次数据,如果使用list每一次都会把所有的对象查询上来 * 而是要iterator仅仅只会查询id,此时所有的对象已经存储在一级缓存(session的缓存)中,可以直接获取 */session = HibernateUtil.openSession();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);}}@Testpublic 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());}/** * 使用iterate仅仅只会去Student的id,此时Student的数据已经在缓存中,所以不会在出现N+1 */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);}}@Testpublic void test04() {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());}/** * 会发出SQL取完整的学生对象,占用内存相对较多 */ls = session.createQuery("from Student").setFirstResult(0).setMaxResults(50).list();stus = ls.iterator();for(;stus.hasNext();) {Student stu = stus.next();System.out.println(stu.getName());}} catch (Exception e) {e.printStackTrace();} finally {HibernateUtil.close(session);}}@Testpublic void test05() {Session session = null;try {/** * 此时会发出一条sql取出所有的学生信息 */session = HibernateUtil.openSession();List<Student> ls = session.createQuery("from Student").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setFirstResult(0).setMaxResults(50).list();Iterator<Student> stus = ls.iterator();for(;stus.hasNext();) {Student stu = stus.next();System.out.println(stu.getName());}/** * 会发出SQL取完整的学生对象,占用内存相对较多 */ls = session.createQuery("from Student").setCacheable(true).setFirstResult(0).setMaxResults(50).list();stus = ls.iterator();for(;stus.hasNext();) {Student stu = stus.next();System.out.println(stu.getName());}} catch (Exception e) {e.printStackTrace();} finally {HibernateUtil.close(session);}}@Testpublic void test06() {Session session = null;try {/** * 此时会发出一条sql取出所有的学生信息 */session = HibernateUtil.openSession();List<Student> ls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").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);}session = null;try {/** * 此时会发出一条sql取出所有的学生信息 */session = HibernateUtil.openSession();List<Student> ls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").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);}}@Testpublic void test07() {Session session = null;try {/** * 查询缓存缓存的不是对象而是id */session = HibernateUtil.openSession();List<Student> ls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").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);}session = null;try {/** * 查询缓存缓存的是id,此时由于在缓存中已经存在了这样的一组学生数据,但是仅仅只是缓存了 * id,所以此处会发出大量的sql语句根据id取对象,这也是发现N+1问题的第二个原因 * 所以如果使用查询缓存必须开启二级缓存 */session = HibernateUtil.openSession();List<Student> ls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").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);}}}
0 0
- Hibernate_一级缓存_Demo
- hibernate_一级缓存
- Hibernate_一级缓存_二级缓存
- Hibernate_二级缓存_Demo
- Hibernate_一级缓存_延迟加载_持久化
- Hibernate_并发(悲观锁&乐观锁)_Demo
- Hibernate_使用原生态sql&Dto传输&最佳实践_Demo
- 一级缓存
- 一级缓存
- 一级缓存
- Hibernate_二级缓存3_使用EHCache缓存
- Hibernate的一级缓存
- 什么是一级缓存
- Hibernater 一级缓存
- hibernate一级缓存(转)
- Hiberante3 一级缓存--释疑
- Hibernate一级缓存
- Hiberante3 一级缓存总结
- 【java SE基础】Java线程详解
- asynctask
- LIBSVM在matlab下的使用安装
- Arduino 101 IMU测试及问题
- 【2016杭电女生赛1009】【挖掘本质找关系 模拟】sum 找到最小的正整数,满足a乘sum(n)==b乘S(2n)
- Hibernate_一级缓存_Demo
- Linux C笔记之 作用域 详解
- [Java] 作业6(字符串)
- threejs(二) 移动,相机
- get请求和post请求的区别
- 【教程】Ubuntu安装cryptominisat教程
- 【2016杭电女生赛1010】【旅行商问题DP + 贪心】Ingress 最多走L距离 最多hackK次 的最大得分
- Android Drawable - Level List Drawable使用详解(附图)
- hihoCoder 1297 扩展欧几里德 && POJ 1061 青蛙的约会