zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己:Hibernate中的 quert.list() 与 quert.iterate() 方法区别

    区别如下:

    quert.list() :

     1):每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存中);

     2):不会从一二级缓存中查询数据;

        3):之执行一条SQL语句,查询所有。

    quert.iterate():

        1):iterator首先通过一条语句取出所有数据的id,然后通过id在hibernate的一级缓存中查找是否存在该对象,

        2):如果存在则直接取出,如果没有则再次发出一条sql语句通过id取得对象(并且加入到缓存中),

        3):这样如果所有的id在缓存中都没有的话就会出现n+1条sql语句的问题。


    这样大家可能会想,同样的查询条件,第一次先list,第二次再iterate,就可以使用到缓存了。

    实际上这是很难的,因为你无法判断什么时候是第一次,而且每次查询的条件通常是不一样的,假如数据库里面有100条记录,id从1到100,

    第一次list的时候出了前50个id,第二次iterate的时候却查询到30至70号id,那么30-50是从缓存里面取的,51到70是从数据库取的,共发送1+20条sql

    相关测试关键代码:

        /****
         * list查询数据:观察产生的SQL语句条数(共 N+1+1 条SQL)
         */
        @Test
        public void listUser()
        {
            //iterate:执行(N+1)条SQL语句:一条查询所有的ID,然后根据OID查询详细信息。
            // 首先会经过缓存,缓存中没有匹配信息的话,则走数据库执行SQL语句查询(并添加到缓存中)
            Iterator<User> from_user1 = session.createQuery("from User").iterate();
            while (from_user1.hasNext())
            {
                System.out.println(from_user1.next());
            }
            System.err.println("*************
    ");
            //list:执行一条SQL语句:只往缓存中存放,无法读取一二级缓存
            List<User> from_user = session.createQuery("from User").list();
            for (User temp:from_user)
            {
                System.out.println(temp);
            }
        }
        /****
         * iterate查询数据:观察产生的SQL语句条数(共2条SQL)
         */
        @Test
        public void iterateUser()
        {
            //list:执行一条SQL语句:只往缓存中存放,无法读取一二级缓存
            List<User> from_user = session.createQuery("from User").list();
            for (User temp:from_user)
            {
                System.out.println(temp);
            }
            System.err.println("*************");
            //iterate:执行(N+1)条SQL语句:一条查询所有的ID,然后根据OID查询详细信息。
            // 首先会经过缓存,缓存中没有匹配信息的话,则走数据库执行SQL语句查询(并添加到缓存中)
            Iterator<User> from_user1 = session.createQuery("from User").iterate();
            while (from_user1.hasNext())
            {
                System.out.println(from_user1.next());
            }
        }
  • 相关阅读:
    Linux网络----数据包的接收过程
    Linux----运维必备的 13 款实用工具
    Linux----常用命令
    Linux----内核学习过程
    Linux性能及调优指南(翻译)之Linux进程管理
    Linux 下cut的使用
    Linux ps -ef和ps aux的区别
    Linux awk命令的一个简单应用
    安卓中的三种监听方式 (按钮控件举例)
    安卓中学习 sqlite
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9809146.html
Copyright © 2011-2022 走看看