美文网首页程序员
Hibernate--一级缓存--事务

Hibernate--一级缓存--事务

作者: 常威爆打来福 | 来源:发表于2017-09-24 19:28 被阅读0次

    一 什么是缓存
    1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
    (1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
    (2)把数据放到内存中,提供读取效率
    2 Hibernate缓存
    (1)hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
    (2)hibernate缓存特点:

    • hibernate的一级缓存

      • hibernate的一级缓存默认就是打开的
      • hibernate的一级缓存使用范围,是session范围
      • hibernate的一级缓存中,存储数据必须 持久态数据
    • hibernate的二级缓存

      • 目前已经不使用了,替代技术 redis
      • 二级缓存默认不是打开的,需要配置
      • 二级缓存使用范围,是sessionFactory范围

    3 验证一级缓存

    • 首先根据id=1查询,返回对象
    • 其次在根据id=2查询,返回对象
    import Utils.HibernateUtils;
    import entity.User;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    public class HibernateSelect {
        @Test
        public void testCasch(){
            //调用工具类得到sessionFactory
           SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
           //获取session
            Session session = sessionFactory.openSession();
            //开启事务
            Transaction tx = session.beginTransaction();
            //1 根据id=3查询
             User user = session.get(User.class,1);
            System.out.println(user);
            //2 在根据id = 3查询
             User user1= session.get(User.class,1);
            System.out.println(user1);
            //提交事务
            tx.commit();
            //关闭
            session.close();
            sessionFactory.close();
    
        }
    }
    
    执行结果

    说明:
    第一步执行get方法之后,发送sql语句查询数据库
    第二步执行get方法之后,没有发送sql语句,查询一级缓存内容

    4 Hibernate一级缓存特性

    • 持久态自动更新
    代码 执行结果 数据库

    二 hibernate的事务操作
    1 概念
    2 事务特性
    3 不考虑隔离性产生问题

    • 脏读
    • 不可重复读
    • 虚读

    4 解决

    • 设置事务隔离级别

    三 事务代码规则写法

    Try{
        开启事务
        提交事务 
    }catch (){
         回滚事务  
    }finally{
       }
    

    样例

    import Utils.HibernateUtils;
    import entity.User;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    public class HibernateTx {
        @Test
        public void Tx(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try{
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx= session.beginTransaction();
                User user = new User();
                user.setName("大伟");
                user.setPassword("666666");
                session.save(user);
                tx.commit();
            }catch (Exception e){
                e.printStackTrace();
                tx.rollback();
            }finally {
                session.close();
                sessionFactory.close();
            }
        }
    }
    
    

    四 Hibernate绑定session
    1 session类似于jdbc的connection,之前web阶段学过threadLocal
    2 Hibernate帮实现与本地线程绑定session
    3 获取与本地线程session
    (1)在hibernate核心配置文件中配置

            <!--在hibernate核心配置文件中配置-->
            <property name="hibernate.current_session_context_class">thread</property>
    

    (2)调用sessionFactory里面的方法得到

        //提供返回与本地线程绑定的session的方法
        public static Session getSessionObject(){
            return sessionFactory.getCurrentSession();
        }
    

    (3)测试

    import Utils.HibernateUtils;
            import entity.User;
            import org.hibernate.Session;
            import org.hibernate.SessionFactory;
            import org.hibernate.Transaction;
            import org.junit.Test;
    
    public class HibernateTx {
        @Test
        public void Tx(){
            Session session = null;
            Transaction tx = null;
            try{
                //与本地线程绑定的session
                session = HibernateUtils.getSessionObject();
                tx= session.beginTransaction();
                User user = new User();
                user.setName("小伟");
                user.setPassword("789456");
                session.save(user);
                tx.commit();
            }catch (Exception e){
                e.printStackTrace();
                tx.rollback();
            }finally {
                session.close();
                //sessionFactory.close();
            }
    
        }
    }
    
    执行结果 查看数据库

    虽然报错,我们却发现数据里面有了数据
    解释:使用与本地线程绑定的session,在线程结束的时候会随着线程的结束自动关闭,不需要我们手动关闭了

    相关文章

      网友评论

        本文标题:Hibernate--一级缓存--事务

        本文链接:https://www.haomeiwen.com/subject/knchextx.html