国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
hibernate的緩存
2010-10-24

hibernate的緩存

文章分類:Java編程

hibernate一級緩存
 
一級緩存很短和session的生命周期一致,一級緩存也叫session級的緩存或事務(wù)級緩存

那些方法支持一級緩存:
 * get()
 * load()
 * iterate(查詢實(shí)體對象)
 
如何管理一級緩存:
 * session.clear(),session.evict()
 
如何避免一次性大量的實(shí)體數(shù)據(jù)入庫導(dǎo)致內(nèi)存溢出
 * 先flush,再clear
 
如果數(shù)據(jù)量特別大,考慮采用jdbc實(shí)現(xiàn),如果jdbc也不能滿足要求可以考慮采用數(shù)據(jù)本身的特定導(dǎo)入工具

一級緩存代碼
  1. //在同一個(gè)session中發(fā)出兩次load查詢   
  2. Student student = (Student)session.load(Student.class, 1);   
  3. System.out.println("student.name=" + student.getName());   
  4.   
  5. //不會發(fā)出sql,因?yàn)閘oad使用緩存   
  6. student = (Student)session.load(Student.class, 1);   
  7. System.out.println("student.name=" + student.getName());   
  8.   
  9. //在同一個(gè)session中發(fā)出兩次get查詢   
  10. Student student = (Student)session.get(Student.class, 1);   
  11. System.out.println("student.name=" + student.getName());   
  12.   
  13. //不會發(fā)出sql,因?yàn)間et使用緩存   
  14. student = (Student)session.get(Student.class, 1);   
  15. System.out.println("student.name=" + student.getName());   
  16.   
  17. //在同一個(gè)session中發(fā)出兩次iterate查詢實(shí)體對象   
  18. Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();   
  19. System.out.println("student.name=" + student.getName());   
  20.   
  21. //會發(fā)出查詢id的sql,不會發(fā)出查詢實(shí)體對象的sql,因?yàn)閕terate使用緩存   
  22. student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();   
  23. System.out.println("student.name=" + student.getName());   
  24.   
  25. //在同一個(gè)session中發(fā)出兩次iterate查詢實(shí)體對象   
  26. String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();   
  27. System.out.println("student.name=" + name);   
  28.   
  29. //iterate查詢普通屬性,一級緩存不會緩存,所以發(fā)出sql   
  30. //一級緩存是緩存實(shí)體對象的   
  31. name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();   
  32. System.out.println("student.name=" + name);   
  33.   
  34. //開啟兩個(gè)session中發(fā)出load查詢   
  35. try {   
  36.      session = HibernateSessionFactory.getSession();   
  37.      session.beginTransaction();   
  38.         
  39.      Student student = (Student)session.load(Student.class, 1);   
  40.      System.out.println("student.name=" + student.getName());   
  41.   
  42.      session.getTransaction().commit();   
  43.         }catch(Exception e) {   
  44.      e.printStackTrace();   
  45.      session.getTransaction().rollback();   
  46.         }finally {   
  47.      HibernateSessionFactory.closeSession(session);   
  48.         }   
  49.            
  50. try {   
  51.      session = HibernateSessionFactory.getSession();   
  52.      session.beginTransaction();   
  53.         
  54.      //會發(fā)出查詢語句,session間不能共享一級緩存的數(shù)據(jù)   
  55.      //因?yàn)樗鼤殡Ssession的生命周期存在和消亡   
  56.      Student student = (Student)session.load(Student.class, 1);   
  57.      System.out.println("student.name=" + student.getName());   
  58. //在同一個(gè)session中先save,在發(fā)出load查詢save過的數(shù)據(jù)   
  59. Student stu = new Student();   
  60. stu.setName("王五");   
  61. Serializable id = session.save(stu);   
  62.   
  63. //不會發(fā)出sql,因?yàn)閟ave是使用緩存的   
  64. Student student = (Student)session.load(Student.class, id);   
  65. System.out.println("student.name=" + student.getName());   
  66. //向數(shù)據(jù)庫中批量加入1000條數(shù)據(jù)   
  67. for (int i=0; i<1000; i++) {   
  68. Student student = new Student();   
  69. student.setName("s_" + i);   
  70. session.save(student);   
  71. //每20條數(shù)據(jù)就強(qiáng)制session將數(shù)據(jù)持久化   
  72. //同時(shí)清除緩存,避免大量數(shù)據(jù)造成內(nèi)存溢出   
  73. if ( i % 20 == 0) {   
  74.     session.flush();   
  75.     session.clear();   
  76. }   
  77. }  

 hibernate二級緩存

二級緩存也稱進(jìn)程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享
二級緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二級緩存

二級緩存的配置和使用:
 * 將echcache.xml文件拷貝到src下
 * 開啟二級緩存,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.use_second_level_cache">true</property>
 * 指定緩存產(chǎn)品提供商,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
 * 指定那些實(shí)體類使用二級緩存(兩種方法)
  * 在映射文件中采用<cache>標(biāo)簽
  * 在hibernate.cfg.xml文件中,采用<class-cache>標(biāo)簽
  
二級緩存是緩存實(shí)體對象的

了解一級緩存和二級緩存的交互 

二級緩存代碼
  1. //開啟兩次session,使用load和get方法家在數(shù)據(jù)都在第二次加載數(shù)據(jù)不會出現(xiàn)hql語句,因?yàn)閟ession共享二級緩存   
  2. Student student = (Student)session.get(Student.class, 1);   
  3. System.out.println("student.name=" + student.getName());   
  4. //關(guān)了,又開了session   
  5. //不會發(fā)出sql,因?yàn)殚_啟了二級緩存,session是共享二級緩存的   
  6. Student student = (Student)session.get(Student.class, 1);   
  7. System.out.println("student.name=" + student.getName());   
  8. // 開啟兩個(gè)session,分別調(diào)用load,在使用SessionFactory清除二級緩存   
  9. Student student = (Student)session.load(Student.class, 1);   
  10. System.out.println("student.name=" + student.getName());   
  11. //管理二級緩存   
  12. SessionFactory factory = HibernateSessionFactory.getSessionFactory();   
  13. factory.evict(Student.class, 1);   
  14. //關(guān)了,又開了session   
  15. //會發(fā)出查詢sql,因?yàn)槎壘彺嬷械臄?shù)據(jù)被清除了   
  16. Student student = (Student)session.load(Student.class, 1);   
  17. System.out.println("student.name=" + student.getName());   
  18. //一級緩存和二級緩存的交互   
  19. //僅向二級緩存讀數(shù)據(jù),而不向二級緩存寫數(shù)據(jù)   
  20. session.setCacheMode(CacheMode.GET);   
  21. Student student = (Student)session.load(Student.class, 1);   
  22. System.out.println("student.name=" + student.getName());   
  23. //關(guān)了,又開了session   
  24. //發(fā)出sql語句,因?yàn)閟ession設(shè)置了CacheMode為GET,所以二級緩存中沒有數(shù)據(jù)   
  25. Student student = (Student)session.load(Student.class, 1);   
  26. System.out.println("student.name=" + student.getName());   
  27. //關(guān)了,又開了session   
  28. //只向二級緩存寫數(shù)據(jù),而不從二級緩存讀數(shù)據(jù)   
  29. session.setCacheMode(CacheMode.PUT);   
  30. //會發(fā)出查詢sql,因?yàn)閟ession將CacheMode設(shè)置成了PUT   
  31. Student student = (Student)session.load(Student.class, 1);   
  32. System.out.println("student.name=" + student.getName());  

 hibernate查詢緩存

查詢緩存是針對普通屬性結(jié)果集的緩存
對實(shí)體對象的結(jié)果集只緩存id

查詢緩存的生命周期,當(dāng)前關(guān)聯(lián)的表發(fā)生修改,那么查詢緩存生命周期結(jié)束

查詢緩存的配置和使用:
 * 在hibernate.cfg.xml文件中啟用查詢緩存,如:
 <property name="hibernate.cache.use_query_cache">true</property>
 * 在程序中必須手動啟用查詢緩存,如:
 query.setCacheable(true);

查詢緩存代碼
  1. Query query = session.createQuery("select s.name from Student s");   
  2. //啟用查詢查詢緩存   
  3. query.setCacheable(true);   
  4.   
  5. List names = query.list();    
  6. for (Iterator iter=names.iterator();iter.hasNext(); ) {   
  7.     String name = (String)iter.next();   
  8.     System.out.println(name);   
  9. }   
  10.   
  11. System.out.println("-------------------------------------");   
  12. query = session.createQuery("select s.name from Student s");   
  13. //啟用查詢查詢緩存   
  14. query.setCacheable(true);   
  15.   
  16. //沒有發(fā)出查詢sql,因?yàn)閱⒂昧瞬樵兙彺?  
  17. names = query.list();    
  18. for (Iterator iter=names.iterator();iter.hasNext(); ) {   
  19.     String name = (String)iter.next();   
  20.     System.out.println(name);   
  21. }  
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
hibernate緩存
hibernate的一級緩存
hibernate--lazy(懶加載)屬性
hql語言實(shí)體對象查詢(二)
9、領(lǐng)域?qū)ο蟮娜N狀態(tài)
hibernate延時(shí)加載的代理對象
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服