hibernate一级缓存

hibernate 一级缓存:(缓存的是实体对象)

一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务缓存

 

哪些方法支持一级缓存:

*get()

*load()

*iterate()  (查询实体对象)

 

如何管理一级缓存:

* session.clear() session.evict()

 

如何避免一次性大量的实体数据入库导致内存溢出

*先flush,再clear

 

如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求,可以考虑采用数据库本身的特定导入工具

 

一.Load测试: 在同一个session中发出两次load查询

       Student sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

 

       sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

       在同一个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库,  第二次load的时候也不会,当使用的时候也不会查询数据库,因为他在缓存里找到,不会发出sql

 

 

Load测试: 开启两个session中发出两次load查询

Student sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

sessioin.close();

………..

       sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

       开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库,  第二次load的时候也不会,当使用的时候查询数据库,因为session间不能共享一级缓存的数据,因为他会随session的生命周期存在和消亡

 

 

二.Get测试: 在同一个session中发出两次get查询

    Student sutdent = (Student)session.get(Student.class,1);

       System.out.println(student.getName());

 

       sutdent = (Student)session.get(Student.class,1);

       System.out.println(student.getName());

       在同一个session中发出两次get查询, 第一次get的时候去查询数据库,第二次get的时候不会查询数据库,因为他在缓存里找到,不会发出sql

 

 

三.iterate测试: 在同一个session中发出两次iterator查询

Student student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();

System.out.println(student.getName());

 

student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();

System.out.println(student.getName());

       在同一个session中发出两次iterator查询,第一次iterate().next()的时候会发出查询id的sql,使用的时候会发出相应的查询实体对象,第二次iterate().next()的时候会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存,不会发出sql

 

 

四.Iterate查询属性测试: 同一个session中发出两次查询属性

String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();

System.out.println(name);

 

String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();

System.out.println(name);

       在同一个session中发出两次查询属性, 第一次iterate().next()的时候会发出查询属性的sql,第二次iterate().next()的时候会发出查询属性的sql,iterate查询普通属性,一级缓存不会缓存,所以会发出sql

 

 

五.同一个session中先save,再发出load查询save过的数据

 

       Student stu = new Student();

       stu.setName(“王五”);

 

   Serializable id = session.save(stu);

 

Student sutdent = (Student)session.load(Student.class,id);

       System.out.println(student.getName());

 

      

save的时候,他会在缓存里放一份,不会发出sql,因为save是使用缓存的

六.同一个session中先调用load查询,然后执行sessio.clear()session.evict(),再调用load查询

 

Student sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

       session.clear();

 

Student sutdent = (Student)session.load(Student.class,1);

       System.out.println(student.getName());

 

 

       sessio.clear()或session.evict()可以管理一级缓存,一级缓存无法取消,但可以管理.

上面的语句都会发出sql 因为一级缓存中的实体被清除了

 

七.向数据库中批量加入1000条数据

 

for(int i=0;i<1000;i++){

       Student student = new Student();

       student.setName(“s” + i);

       session.save(student);

//每20条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出

       if( i %20 == 0 ){

              session.flush();

              session.clear();

}

}

 

posted on 2009-04-06 11:59 胡鹏 阅读(394) 评论(0)  编辑  收藏 所属分类: hibernate


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(3)

随笔分类

随笔档案

agile

搜索

最新评论

阅读排行榜

评论排行榜