Hibernate学习笔记之session缓存(一级缓存)

由于一级缓存属于session级别的缓存,所以一级缓存不能跨session区域,不同的session执行的查询结果存在自己的缓存中,但同一session执行的所有查询结果都会缓存起来,查询结果不一定是一次的查询结果,可以是多次的查询整合起来的结果;下面传一些本人测试的结果:(使用缓存可以提高数据库优化性能)
`package com.test;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.dao.HibernateSessionFactory;
import com.dao.MenuDAO;
import com.entity.Menu;
/**
*
* @ClassName: TestFirstBuffer
* @Description: TODO(session 一级缓存测试类)
* @author ShiLing-DENG
* @date 2016年10月27日 上午10:16:34
*/
public class TestFirstBuffer {

public static void main(String[] args) {
    //使用工厂类获取到session
    Session session = HibernateSessionFactory.getSession();
    //执行查询语句,这里查到的是ID>2且ID<7的数据;会产生session级别的缓存
    Query query = session.createQuery("from Menu m where m.id>2 and m.id<7 ");
    List menulist = query.list();
    for(Menu menu : menulist){
        System.out.println(menu.getId()+":"+menu.getName());
    }
    //执行session.get()查询语句,查询ID为7的记录,由于7不在2-7之间,所以存在一级缓存中,需要再执行sql语句到数据库中查询
    Menu me = (Menu) session.load(Menu.class, 7);
    System.out.println(me.getName());//load是延迟加载机制,如果不使用"me",就不会执行sql语句
    //查询到了ID>27的记录
    List listment = session.createQuery("from Menu m where m.id >27").list();
    for(Menu menu : listment){
        System.out.println(menu.getId()+":"+menu.getName());
    }
    System.out.println("-----测试一下-----");
    //查询ID是4的记录,前面已经查询了 所以直接调用缓存的结果
    Menu men = (Menu) session.get(Menu.class, 4);
    System.out.println(men.getName()+":"+men.getId());
    //迭代器查询;会出现“N+1”条SQL语句,这里会查询到id<10 的记录,只要缓存没有的都会执行sql查询语句
    Iterator tlist = 
            session.createQuery("select m from Menu m where m.id<10").iterate();
    while(tlist.hasNext()){
        Menu mm = (Menu) tlist.next();
        System.out.println(mm.getId()+":"+mm.getName());
    }
    //由于之前没有id=11的记录,这里也会执行一条sql查询语句
    MenuDAO menudao = new MenuDAO();
    Menu menb = menudao.findById(11);
    System.out.println("测试一下啊--"+menb.getName());
    //上一步查了11的记录,所以这一步不会有查询的sql语句,直接使用缓存
    MenuDAO MEDAO = new MenuDAO();
    Menu mmm = MEDAO.findById(11);
    System.out.println("测试二下"+mmm.getId());
}

}
`
以下是控制台输出结果:

Hibernate: select menu0_.id as id2_, menu0_.name as name2_, menu0_.parentmenu as parentmenu2_, menu0_.url as url2_ from imassystem.menu menu0_ where menu0_.id>2 and menu0_.id<7
4:短信群发
5:用户资料修改
6:公司信息管理
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
其他业务
Hibernate: select menu0_.id as id2_, menu0_.name as name2_, menu0_.parentmenu as parentmenu2_, menu0_.url as url2_ from imassystem.menu menu0_ where menu0_.id>27
28:权限调度
29:安全管理
—–测试一下—–
短信群发:4
Hibernate: select menu0_.id as col_0_0_ from imassystem.menu menu0_ where menu0_.id<10
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
1:业务中心
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
2:系统管理
4:短信群发
5:用户资料修改
6:公司信息管理
7:其他业务
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
8:系统配置
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
9:修改用户名密码
Hibernate: select menu0_.id as id2_0_, menu0_.name as name2_0_, menu0_.parentmenu as parentmenu2_0_, menu0_.url as url2_0_ from imassystem.menu menu0_ where menu0_.id=?
测试一下啊–网站维护
测试二下11

你可能感兴趣的:(Hibernate)