一级缓存

hibernate一级缓存

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

那些方法支持一级缓存:
* get()
* load()
* iterate(查询实体对象)

Iterator查询普通属性,一级缓存不会缓存,所以会发出SQL,一级缓存是缓存实体对象的

如何管理一级缓存:
* session.clear(),session.evict()

如何避免一次性大量的实体数据入库导致内存溢出
* 先flush,再clear

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

  1. ======================================================
  2. 在同一个session中发出两次load查询
  3. Studentstudent=(Student)session.load(Student.class,1);
  4. System.out.println("student.name="+student.getName());
  5. //不会发出sql,因为load使用缓存
  6. student=(Student)session.load(Student.class,1);
  7. System.out.println("student.name="+student.getName());
  8. ============================================================
  9. 在同一个session中发出两次get查询
  10. Studentstudent=(Student)session.get(Student.class,1);
  11. System.out.println("student.name="+student.getName());
  12. //不会发出sql,因为get使用缓存
  13. student=(Student)session.get(Student.class,1);
  14. System.out.println("student.name="+student.getName());
  15. ===============================================================
  16. 在同一个session中发出两次iterate查询实体对象
  17. Studentstudent=(Student)session.createQuery("fromStudentswheres.id=1").iterate().next();
  18. System.out.println("student.name="+student.getName());
  19. //会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存
  20. student=(Student)session.createQuery("fromStudentswheres.id=1").iterate().next();
  21. System.out.println("student.name="+student.getName());
  22. =================================================================
  23. 在同一个session中发出两次iterate查询实体对象
  24. Stringname=(String)session.createQuery("selects.namefromStudentswheres.id=1").iterate().next();
  25. System.out.println("student.name="+name);
  26. //iterate查询普通属性,一级缓存不会缓存,所以发出sql
  27. //一级缓存是缓存实体对象的
  28. name=(String)session.createQuery("selects.namefromStudentswheres.id=1").iterate().next();
  29. System.out.println("student.name="+name);
  30. ===================================================================
  31. 开启两个session中发出load查询
  32. try{
  33. session=HibernateUtils.getSession();
  34. session.beginTransaction();
  35. Studentstudent=(Student)session.load(Student.class,1);
  36. System.out.println("student.name="+student.getName());
  37. session.getTransaction().commit();
  38. }catch(Exceptione){
  39. e.printStackTrace();
  40. session.getTransaction().rollback();
  41. }finally{
  42. HibernateUtils.closeSession(session);
  43. }
  44. try{
  45. session=HibernateUtils.getSession();
  46. session.beginTransaction();
  47. //会发出查询语句,session间不能共享一级缓存的数据
  48. //因为它会伴随session的生命周期存在和消亡
  49. Studentstudent=(Student)session.load(Student.class,1);
  50. System.out.println("student.name="+student.getName());
  51. session.getTransaction().commit();
  52. ==================================================================
  53. 在同一个session中先save,在发出load查询save过的数据
  54. Studentstu=newStudent();
  55. stu.setName("王五");
  56. Serializableid=session.save(stu);//save有一个返回值,即是它的ID
  57. //不会发出sql,因为save是使用缓存的
  58. Studentstudent=(Student)session.load(Student.class,id);
  59. System.out.println("student.name="+student.getName());
  60. ============================================================
  61. 向数据库中批量加入1000条数据
  62. for(inti=0;i<1000;i++){
  63. Studentstudent=newStudent();
  64. student.setName("s_"+i);
  65. session.save(student);
  66. //每20条数据就强制session将数据持久化
  67. //同时清除缓存,避免大量数据造成内存溢出
  68. if(i%20==0){
  69. session.flush();
  70. session.clear();
  71. }
  72. }

你可能感兴趣的:(sql,Hibernate,jdbc)