Hibernate框架---- N+1是什么?它们的list和iterator区别(九)

之前我们说过hibernate的缓存机制,可以将它看成一个Map,通过key在缓存里面找value。

hibernate通过query查询放查询数据,比如我们要查询100条数据,但是其中40条已经缓存在缓存中了,但是使用query的list方法,那么这100条数据就会全部从数据库中查询,而会无视缓存中存在40条数据。


那么N+1是什么?hibernate执行一条sql语句查询这100条数据,但是结果只返回这100条数据的id,然后再根据id进一步的进行查询。

如果id在缓存中,那么就先从缓存中获取这数据对象,然后缓存中没有的再从数据库重查询。hibernate实现N+1的方式便是使用Iterator。

大概的步骤:

  1. 先通过Query的iterator把所有满足条件的Product的id查询出来
  2. 然后通过it.next()查询每一个对象,如果这个对象在缓存中,就直接在缓存中提取,否则就从数据库中查询。
N+1中的1指的是只返回id的sql语句,N指的是如果在缓存中找不到对应的数据,就到数据库中去查询。

测试java代码,注意这查询中并没有开启事务,上次说了,openSession方式获取session对象的查询可以不使用事务,但是新增、删除和修改必须放在事务中操作。

package com.vipcpi.test;

import java.util.Iterator;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.vipcpi.Product;

public class testIterator {
	
	public static void main(String[] args) {
		SessionFactory sf=new Configuration().configure().buildSessionFactory();
		Session s=sf.openSession();
		
		String name="csdn";
		Query q=s.createQuery("from Product where name like ?");
		q.setString(0, "%"+name+"%");
		
		Iterator it=q.iterate();
		while(it.hasNext()){
			Product p=it.next();
			System.out.println(p.getName());
		}
		
		sf.close();
		
	}
}



你可能感兴趣的:(Hibernate)