hibernate 一级缓存测试

Session工厂类:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.stat.Statistics;

public class HibernateSessionFactory {

    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static Configuration configuration = new Configuration();
    private static SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;
    static {
        sessionFactory = configuration.configure(configFile).buildSessionFactory();
    }

    private HibernateSessionFactory(){

    }

    public static Session getSession(){
        Session session = threadLocal.get();
        if(session == null || !session.isOpen()){
            session = (sessionFactory != null) ? sessionFactory.openSession():null;
            threadLocal.set(session);
        }
        return session;
    }

    public static Statistics getstat(){
        return sessionFactory.getStatistics();
    }

    public static void close(){
        sessionFactory.close();
    }
}

Scenario1:
每次开启一个新的session,提交事物后关闭session。

Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();

        Stu stu = (Stu) session.get(Stu.class, 1);
        System.out.println(stu.getSdept());
        trans.commit();
        session.close();
        System.out.println("-------------------------------------");

        session = HibernateSessionFactory.getSession();
        trans = session.beginTransaction();
        Stu stu2 = (Stu) session.get(Stu.class, 1);
        System.out.println(stu2.getSdept());
        trans.commit();
        session.close();
        System.out.println("-------------------------------------");

        System.out.println("stu==stu2 result is "+(stu==stu2));

        System.out.println("-------------------------------------");
        Session session2 = HibernateSessionFactory.getSession();
        trans = session2.beginTransaction();
        Stu stu3 = (Stu) session2.get(Stu.class, 1);
        System.out.println(stu3.getSdept());
        trans.commit();
        session2.close();
        System.out.println("-------------------------------------");
        HibernateSessionFactory.close();

运行结果:

Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------
Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------
stu==stu2 result is false
-------------------------------------
Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------

说明: 因为session在事物提交后被关闭了,所以每次hibernate都要执行一次查询

Scenario:2
注掉第一个查询的session关闭方法

Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();

        Stu stu = (Stu) session.get(Stu.class, 1);
        System.out.println(stu.getSdept());
        trans.commit();
        //将此次关闭session给注掉
//      session.close();
        System.out.println("-------------------------------------");

        session = HibernateSessionFactory.getSession();
        trans = session.beginTransaction();
        Stu stu2 = (Stu) session.get(Stu.class, 1);
        System.out.println(stu2.getSdept());
        trans.commit();
        session.close();
        System.out.println("-------------------------------------");

        System.out.println("stu==stu2 result is "+(stu==stu2));

        System.out.println("-------------------------------------");
        Session session2 = HibernateSessionFactory.getSession();
        trans = session2.beginTransaction();
        Stu stu3 = (Stu) session2.get(Stu.class, 1);
        System.out.println(stu3.getSdept());
        trans.commit();
        session2.close();
        System.out.println("-------------------------------------");

        HibernateSessionFactory.close();

运行结果:

Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------
Computer Information Colleague
-------------------------------------
stu==stu2 result is true
-------------------------------------
Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------

说明: 第二个查询并没有执行数据库查询操作,而是使用的第一次查询的缓存。可以看到stu==stu2 result is true,说明stu和stu2其实指向的是同一个对象。

Scenario3:
将第二个session关闭的操作注掉。

Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();

        Stu stu = (Stu) session.get(Stu.class, 1);
        System.out.println(stu.getSdept());
        trans.commit();
        session.close();
        System.out.println("-------------------------------------");

        session = HibernateSessionFactory.getSession();
        trans = session.beginTransaction();
        Stu stu2 = (Stu) session.get(Stu.class, 1);
        System.out.println(stu2.getSdept());
        trans.commit();
    //将第二个session关闭的操作注掉
//      session.close();
        System.out.println("-------------------------------------");

        System.out.println("stu==stu2 result is "+(stu==stu2));

        System.out.println("-------------------------------------");
        Session session2 = HibernateSessionFactory.getSession();
        trans = session2.beginTransaction();
        Stu stu3 = (Stu) session2.get(Stu.class, 1);
        System.out.println(stu3.getSdept());
        trans.commit();
        session2.close();
        System.out.println("-------------------------------------");

        HibernateSessionFactory.close();

运行结果:

Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------
Hibernate: 
    select
        stu0_.sno as sno1_2_0_,
        stu0_.sname as sname2_2_0_,
        stu0_.sex as sex3_2_0_,
        stu0_.age as age4_2_0_,
        stu0_.sdept as sdept5_2_0_ 
    from
        test.stu stu0_ 
    where
        stu0_.sno=?
Computer Information Colleague
-------------------------------------
stu==stu2 result is false
-------------------------------------
Computer Information Colleague
-------------------------------------

说明: 第三个查询就是用到第二个查询的缓存结果,虽然创建了新的session,但是并没有真正执行查询操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值