一个流浪书生 2017-02-20 04:42 采纳率: 0%
浏览 763
已结题

hibernate缓存失效?求教!

在学习hibernate的时候发现只要在session.createQuery("from Student").list 中加上.setFirstResult(0).setMaxResults(50) 就会发生N+1问题。

这个是我的一级缓存测试代码: HibernateUtil是把SessionFactory跟session包装起来了。

    public void Test04(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            List<Student> ls = session.createQuery("select stu from Student stu ")
                    .setFirstResult(0).setMaxResults(100).list();
            Iterator<Student> stus = ls.iterator();
            for(;stus.hasNext();){
                Student stu = stus.next();
                System.out.println(stu.getName());
            }
            stus = session.createQuery("select stu from Student stu ").setFirstResult(0).setMaxResults(50).iterate();
            while(stus.hasNext()){
                Student stu = stus.next();
                System.out.println(stu.getName());
            }
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }
    }

本来应该是第一句SQL结束后下面只会执行一条SQL查询到缓存里的ID,然后就输出其他数据,
但结果是每一条数据都要去查询,造成N+1问题。结果如图:
图片说明

之后就是二级缓存也是同样的情况,(ps:就只有查询分页数据的时候有问题,其他都没问题,查询缓存我试过了。所以我就不放二级缓存的配置了。)
代码如下:

    public void Test05(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            List<Student> stus = session.createQuery(" from Student ")
                    .setFirstResult(0).setMaxResults(50).list();

        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }

        try {
            session = HibernateUtil.getSession();
            Iterator<Student> ls = session.createQuery("from Student")
                    .setFirstResult(0).setMaxResults(50)
                    .iterate();
                    while(ls.hasNext()){
                        Student stu = ls.next();
                        System.out.println(stu.getName());
                    }
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        } finally{
            if(session!=null)
                session.close(); 
        }
    }

结果如图:
图片说明

现在的情况是;如果我把.setMaxResults(50)去掉的话就会正常。 或者我使用了
session.createQuery("from Student").setParameter(0, "%张%").setFirstResult(0).setMaxResults(50) 的话,就又会正常运行了。只发了两条SQL, 求教大神们,高手们告之我究竟是哪里出错误?我在网上找了好多题目都找不到原因。

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2017-02-20 17:41
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝