zoukankan      html  css  js  c++  java
  • Hibernate学习笔记_性能优化

    注意session.clear()的运用,尤其在不断分页循环的时候

    a)    在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象

    b)    另外一种形式的内存泄露  (  //面试题:Java有内存泄漏吗?语法级别没有 但是可由java引起,例如:连接池不关闭,或io读取后不关闭)

    1+N问题 (典型的面试题)                                             

    a)    @ManyToOne(fetch=FetchType.LAZY)

           //fetch=FetchType.LAZY 解决N+1问题 说明如下:

           //当多对一(@ManyToOne)已经设定属性" fetch=FetchType.LAZY "时

           //只有当需要时(如:t.getCategory().getName()时)才会去获取关联表中数据 可以解决N+1问题

    b)    @BatchSize

           //@BatchSize 解决N+1问题 说明如下:

           //在与查询表(此例中为Topic类)关联的表类(此例中为Category类)头处加@BatchSize(size=5)

           //表示每次可查出5条记录 从而减少了select语句的个数

    c)    join fetch

           //join fetch 解决N+1问题 说明如下:

           //修改hql语句为--"  from Topic t left join fetch t.category c  "

    d)    QBC

           //QBC(Query By Criteria) 解决N+1问题 说明如下:

           //使用QBC的 createCriteria(*.class)执行查询 也可避免N+1问题

     list和iterate不同之处(//主要为了面试 )

    a)    list取所有

    @Test
        public void testQueryList() {
            Session session = sf.openSession();
            session.beginTransaction();
            //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
            List<Category> categories = (List<Category>)session.createQuery("from Category").list();
            
            for(Category c : categories) {
                System.out.println(c.getName());
            }
            
            List<Category> categories2 = (List<Category>)session.createQuery("from Category").list();
            for(Category c : categories2) {
                System.out.println(c.getName());
            }
            session.getTransaction().commit();
            session.close();
            
        }

    b)    iterate先取 ID,等用到的时候再根据ID来取对象

    @Test
        public void testQueryIterate() {
            Session session = sf.openSession();
            session.beginTransaction();
            //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
            Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate();
            
            
            while(categories.hasNext()) {
                Category c = categories.next();
                System.out.println(c.getName());
            }
            
            Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate();
            
            while(categories2.hasNext()) {
                Category c = categories2.next();
                System.out.println(c.getName());
            }
            session.getTransaction().commit();
            session.close();
            
        }

    c)    session中list第二次发出,仍会到数据库査询

    d)    iterate 第二次,首先找session 级缓存

  • 相关阅读:
    html中script标签的使用方法
    css关于浮动的高度塌陷
    canvas用数组方式做出下雨效果
    canvas简易画板。
    html5新标签
    闭包的意义及用法
    字符串的添加方法
    js几种数组遍历方法.
    简易网页打卡页面.
    回忆继承多态
  • 原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4151476.html
Copyright © 2011-2022 走看看