在hibernate中,由于一级缓存的生命周期跟Session的生命周期一样,所以也可以理解为一级缓存是session缓存。
一、通过在做查询的时候,有几个查询方法支持一级缓存,它们分别是:load(),get(),iterate(),其中要注意的是iterate方法只对实体对象查询才支持一级缓存,如果使用iterate来查询对象里面的相关属性,则查询的时候不支持一级缓存。
1、load()方法。
例子:
2、get()方法。
例子:
3、iterate()方法查询实体对象
例子:
4、iterate()方法查询实体对象属性(不支持一级缓存)
例子:
PS:由于iterate()方法查询实体对象属性,一级缓存不会产生作用,所以发出两条sql语句。
二、一级缓存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通过clear(),evict()方法来清除缓存,当不需要使用一级缓存或者是更加高效率使用一级缓存。
如果在一次性更新或者加入数量量比较大的情况下,更加要管理好一级缓存。
例子:
一、通过在做查询的时候,有几个查询方法支持一级缓存,它们分别是:load(),get(),iterate(),其中要注意的是iterate方法只对实体对象查询才支持一级缓存,如果使用iterate来查询对象里面的相关属性,则查询的时候不支持一级缓存。
1、load()方法。
例子:
1
Student s = (Student)session.load(Student.class, 1);
2
System.out.println(s.getName());
3
System.out.println("---------------------");
4
s = (Student)session.load(Student.class, 1);
5
System.out.println(s.getName());
PS:只发出一条sql语句,虽然这里使用两次load方法,但是第一次load方法对于id为1的记录进行加载,到第3行才发出一条sql语句及符合的数据,这样就把数据放在一级缓存里面,在第4行开始继续使用load就从一级缓存里面抽取。
Student s = (Student)session.load(Student.class, 1);2
System.out.println(s.getName());3
System.out.println("---------------------");4
s = (Student)session.load(Student.class, 1);5
System.out.println(s.getName());2、get()方法。
例子:
1
Student s = (Student)session.get(Student.class, 1);
2
System.out.println(s.getName());
3
System.out.println("---------------------");
4
s = (Student)session.load(Student.class, 1);
5
System.out.println(s.getName());
PS:跟1中load一样,只发出一条sql语句。
Student s = (Student)session.get(Student.class, 1);2
System.out.println(s.getName());3
System.out.println("---------------------");4
s = (Student)session.load(Student.class, 1);5
System.out.println(s.getName());3、iterate()方法查询实体对象
例子:
1
Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
2
System.out.println("student.name=" + student.getName());
3
4
//会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存
5
student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
6
System.out.println("student.name=" + student.getName());
PS:总共发出3条sql语句,1、2行发出两条语句,1条是查询实体对象的sql,另一条是查询实体对象的name属性,由于使用一级缓存,之前1、2行查询的实体存放在一级缓存里面,所以5、6行利用一级缓存里面的数据只发出一条查询id的sql。
Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();2
System.out.println("student.name=" + student.getName());3
4
//会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存5
student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();6
System.out.println("student.name=" + student.getName());4、iterate()方法查询实体对象属性(不支持一级缓存)
例子:
1
String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
2
System.out.println("student.name=" + name);
3
4
//iterate查询普通属性,一级缓存不会缓存,所以发出sql
5
//一级缓存是缓存实体对象的
6
name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
7
System.out.println("student.name=" + name);
String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();2
System.out.println("student.name=" + name);3
4
//iterate查询普通属性,一级缓存不会缓存,所以发出sql5
//一级缓存是缓存实体对象的6
name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();7
System.out.println("student.name=" + name);PS:由于iterate()方法查询实体对象属性,一级缓存不会产生作用,所以发出两条sql语句。
二、一级缓存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通过clear(),evict()方法来清除缓存,当不需要使用一级缓存或者是更加高效率使用一级缓存。
如果在一次性更新或者加入数量量比较大的情况下,更加要管理好一级缓存。
例子:
1
for(int i=0;i<10000;i++)
2
{
3
Student s = new Student();
4
s.setName("s"+i);
5
session.save(s);
6
if(i%20==0)
7
{
8
session.flush(); // 将缓存中的对象保存到数据库,
9
session.clear(); //
10
}
11
}
for(int i=0;i<10000;i++)2
{3
Student s = new Student();4
s.setName("s"+i);5
session.save(s);6
if(i%20==0)7
{8
session.flush(); // 将缓存中的对象保存到数据库,9
session.clear(); //10
}11
}PS:在数据量比较大的情况下管理一级缓存的做法,一般都是设定一定数量的记录给更新或者保存等操作之后,避免一次性大量的实体数据入库导致内存溢出,所以才去先是用第8行的flush和第9行的clear方法来实现比较好的缓存管理。在数据量特别大的时候,可以使用jdbc来实现,因为hibernate不太适合于数据量特别大的场合使用,如果连jdbc都满足不了数据量的效率要求,只好利用相关的数据库机制来实现。
原文地址:http://www.blogjava.net/apple0668/archive/2008/10/31/237920.html
本文详细解析了Hibernate中一级缓存的工作原理及其使用方法,包括load(), get(), iterate()方法的支持情况和使用场景,同时介绍了如何合理管理缓存以提高程序效率,并通过实例展示了在大量数据更新或保存时的一级缓存管理策略。
7179

被折叠的 条评论
为什么被折叠?



