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 级缓存

原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4151476.html