千家信息网

(10)Hibernate一级缓存

发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,1、为什么要用缓存?目的:减少对数据库的访问次数!从而提升hibernate的执行效率!2、Hibernate中缓存分类一级缓存、二级缓存3、一级缓存的概念1)Hibenate中一级缓存,也叫做ses
千家信息网最后更新 2025年01月28日(10)Hibernate一级缓存


1、为什么要用缓存?

目的:减少对数据库的访问次数!从而提升hibernate的执行效率!


2、Hibernate中缓存分类

一级缓存、二级缓存


3、一级缓存的概念

1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!

2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。

3)Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。


4、Hibernate一级缓存的特点

只在(当前)session范围有效,作用时间短,效果不是特别明显!

在短时间内多次操作数据库,效果比较明显!



5、缓存相关几个方法及作用

session.flush(); 让一级缓存与数据库同步

session.evict(object); 清空一级缓存中指定的对象

session.clear(); 清空一级缓存中缓存的所有对象

在什么情况用上面方法?

批量操作使用使用:

Session.flush(); // 先与数据库同步

Session.clear(); // 再清空一级缓存内容


6、Hibernate一级缓存的面试题

面试题1: 不同的session是否会共享缓存数据?

不会。

面试题2: list与iterator查询的区别?

list():一次把所有的记录都查询出来,会放入缓存,但不会从缓存中获取数据。

Iterator():进行N+1次查询; N表示所有的记录总数。即会先发送一条语句查询所有记录的主键(1次),再根据每一个主键再去数据库查询(N次)!会放入缓存,也会从缓存中取数据!



User.java

package com.rk.hibernate.i_status;public class User{        private int userId;        private String username;        public int getUserId()        {                return userId;        }        public void setUserId(int userId)        {                this.userId = userId;        }        public String getUsername()        {                return username;        }        public void setUsername(String username)        {                this.username = username;        }        @Override        public String toString()        {                return "User [userId=" + userId + ", username=" + username + "]";        }        }

User.hbm.xml

                                                                                        

App2_Cache.java

package com.rk.hibernate.i_status;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App2_Cache{        private static SessionFactory sf;        static        {                sf = new Configuration()                                                .configure()                                                .addClass(User.class)                                                .buildSessionFactory();        }                @Test        public void testGet()        {                Session session = sf.openSession();                session.beginTransaction();                                // 查询                User u1 = (User) session.get(User.class, 2);// 先检查缓存中是否有数据,如果有,则不查询数据库,直接从缓存中获取                User u2 = (User) session.get(User.class, 2);                                System.out.println(u1);                System.out.println(u2);                System.out.println(u1 == u2); // true                                session.getTransaction().commit();                session.close();        }                @Test        public void testFlush()        {                Session session = sf.openSession();                session.beginTransaction();                                User u = (User)session.get(User.class, 2);                u.setUsername("ABC");                                // 缓存数据与数据库同步                session.flush(); //如果没有这一语句,则执行一次update;加上这条语句后,执行两次update。                                u.setUsername("DEF");                                session.getTransaction().commit();// session.flush();                session.close();        }                @Test        public void testClear()        {                Session session = sf.openSession();                session.beginTransaction();                                // 查询                User u1 = (User)session.get(User.class, 2);                                // 清空缓存内容//              session.clear();// 清空所有                session.evict(u1);// 清除指定                                User u2 = (User)session.get(User.class, 2);                                session.getTransaction().commit();                session.close();        }                @Test        public void testSessionScope()        {                Session session1 = sf.openSession();                session1.beginTransaction();                                Session session2 = sf.openSession();                session2.beginTransaction();                                // u1放入session1的缓存区                User u1 = (User) session1.get(User.class, 2);                // u2放入session2的缓存区                User u2 = (User) session2.get(User.class, 2);                                                session1.getTransaction().commit();                session1.close();                                session2.getTransaction().commit();                session2.close();        }}

App3_List_Iterator.java

package com.rk.hibernate.i_status;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App3_List_Iterator{        private static SessionFactory sf;        static        {                sf = new Configuration()                                                .configure()                                                .addClass(User.class)                                                .buildSessionFactory();        }                /**         * list与iterator区别         * 1. list 方法         * 2. iterator 方法         * 3. 缓存         * @throws Exception         */        //1.  list 方法        @Test        public void list()        {                Session session = sf.openSession();                session.beginTransaction();                // HQL查询                Query q = session.createQuery("from User ");                // list()方法                List list = q.list();                for (int i = 0; i < list.size(); i++)                {                        System.out.println(list.get(i));                }                session.getTransaction().commit();                session.close();        }                //2. iterator 方法        @Test        public void iterator() throws Exception        {                Session session = sf.openSession();                session.beginTransaction();                // HQL查询                Query q = session.createQuery("from User ");                // iterator()方法                Iterator it = q.iterate();                while (it.hasNext())                {                        // 得到当前迭代的每一个对象                        User user = it.next();                        System.out.println(user);                }                                                                session.getTransaction().commit();                  session.close();        }                //3. 测试List缓存        @Test        public void testList()        {                Session session = sf.openSession();                session.beginTransaction();                                Query q = session.createQuery("from User");                List list1 = q.list();                if(list1 != null && list1.size()>0)                {                        for(User u : list1)                        {                                System.out.println(u);                        }                }                                System.out.println("------------------------------------");                List list2 = q.list();                if(list2 != null && list2.size()>0)                {                        for(User u : list2)                        {                                System.out.println(u);                        }                }                                System.out.println("list1 == list2 ?  " + (list1 == list2)); // false                                for(int i=0;i it = q.iterate();                while(it.hasNext())                {                        User u = it.next();                        System.out.println(u);                }                                System.out.println("------------------------------------");                it = q.iterate();                while(it.hasNext())                {                        User u = it.next();                        System.out.println(u);                }                                session.getTransaction().commit();                session.close();        }                @Test        public void testListIterator()        {                Session session = sf.openSession();                session.beginTransaction();                                Query q = session.createQuery("from User");                List list = q.list();                for(User u : list)                {                        System.out.println(u);                }                                System.out.println("--------------------------------------------");                                Iterator it = q.iterate();                while(it.hasNext())                {                        User u = it.next();                        System.out.println(u);                }                                session.getTransaction().commit();                session.close();        }                @Test        public void testGet()        {                Session session = sf.openSession();                session.beginTransaction();                                Query q = session.createQuery("from User ");                List list = q.list();                for (int i = 0; i < list.size(); i++)                {                        System.out.println(list.get(i));                }                                Query q2 = session.createQuery("from User where userId<5");                Iterator it = q2.iterate();                while (it.hasNext())                {                        // 得到当前迭代的每一个对象                        User user = it.next();                        System.out.println(user);                }                                session.getTransaction().commit();                session.close();        }                public void temp()        {                Session session = sf.openSession();                session.beginTransaction();                                                                session.getTransaction().commit();                session.close();        }}




0