欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
hibernate的緩存
2010-10-24

hibernate的緩存

文章分類(lèi):Java編程

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

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

一級緩存代碼
  1. //在同一個(gè)session中發(fā)出兩次load查詢(xún)   
  2. Student student = (Student)session.load(Student.class, 1);   
  3. System.out.println("student.name=" + student.getName());   
  4.   
  5. //不會(huì )發(fā)出sql,因為load使用緩存   
  6. student = (Student)session.load(Student.class, 1);   
  7. System.out.println("student.name=" + student.getName());   
  8.   
  9. //在同一個(gè)session中發(fā)出兩次get查詢(xún)   
  10. Student student = (Student)session.get(Student.class, 1);   
  11. System.out.println("student.name=" + student.getName());   
  12.   
  13. //不會(huì )發(fā)出sql,因為get使用緩存   
  14. student = (Student)session.get(Student.class, 1);   
  15. System.out.println("student.name=" + student.getName());   
  16.   
  17. //在同一個(gè)session中發(fā)出兩次iterate查詢(xún)實(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. //會(huì )發(fā)出查詢(xún)id的sql,不會(huì )發(fā)出查詢(xún)實(shí)體對象的sql,因為iterate使用緩存   
  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查詢(xún)實(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查詢(xún)普通屬性,一級緩存不會(huì )緩存,所以發(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. //開(kāi)啟兩個(gè)session中發(fā)出load查詢(xún)   
  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.      //會(huì )發(fā)出查詢(xún)語(yǔ)句,session間不能共享一級緩存的數據   
  55.      //因為它會(huì )伴隨session的生命周期存在和消亡   
  56.      Student student = (Student)session.load(Student.class, 1);   
  57.      System.out.println("student.name=" + student.getName());   
  58. //在同一個(gè)session中先save,在發(fā)出load查詢(xún)save過(guò)的數據   
  59. Student stu = new Student();   
  60. stu.setName("王五");   
  61. Serializable id = session.save(stu);   
  62.   
  63. //不會(huì )發(fā)出sql,因為save是使用緩存的   
  64. Student student = (Student)session.load(Student.class, id);   
  65. System.out.println("student.name=" + student.getName());   
  66. //向數據庫中批量加入1000條數據   
  67. for (int i=0; i<1000; i++) {   
  68. Student student = new Student();   
  69. student.setName("s_" + i);   
  70. session.save(student);   
  71. //每20條數據就強制session將數據持久化   
  72. //同時(shí)清除緩存,避免大量數據造成內存溢出   
  73. if ( i % 20 == 0) {   
  74.     session.flush();   
  75.     session.clear();   
  76. }   
  77. }  

 hibernate二級緩存

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

二級緩存的配置和使用:
 * 將echcache.xml文件拷貝到src下
 * 開(kāi)啟二級緩存,修改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í)體類(lèi)使用二級緩存(兩種方法)
  * 在映射文件中采用<cache>標簽
  * 在hibernate.cfg.xml文件中,采用<class-cache>標簽
  
二級緩存是緩存實(shí)體對象的

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

二級緩存代碼
  1. //開(kāi)啟兩次session,使用load和get方法家在數據都在第二次加載數據不會(huì )出現hql語(yǔ)句,因為session共享二級緩存   
  2. Student student = (Student)session.get(Student.class, 1);   
  3. System.out.println("student.name=" + student.getName());   
  4. //關(guān)了,又開(kāi)了session   
  5. //不會(huì )發(fā)出sql,因為開(kāi)啟了二級緩存,session是共享二級緩存的   
  6. Student student = (Student)session.get(Student.class, 1);   
  7. System.out.println("student.name=" + student.getName());   
  8. // 開(kāi)啟兩個(gè)session,分別調用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)了,又開(kāi)了session   
  15. //會(huì )發(fā)出查詢(xún)sql,因為二級緩存中的數據被清除了   
  16. Student student = (Student)session.load(Student.class, 1);   
  17. System.out.println("student.name=" + student.getName());   
  18. //一級緩存和二級緩存的交互   
  19. //僅向二級緩存讀數據,而不向二級緩存寫(xiě)數據   
  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)了,又開(kāi)了session   
  24. //發(fā)出sql語(yǔ)句,因為session設置了CacheMode為GET,所以二級緩存中沒(méi)有數據   
  25. Student student = (Student)session.load(Student.class, 1);   
  26. System.out.println("student.name=" + student.getName());   
  27. //關(guān)了,又開(kāi)了session   
  28. //只向二級緩存寫(xiě)數據,而不從二級緩存讀數據   
  29. session.setCacheMode(CacheMode.PUT);   
  30. //會(huì )發(fā)出查詢(xún)sql,因為session將CacheMode設置成了PUT   
  31. Student student = (Student)session.load(Student.class, 1);   
  32. System.out.println("student.name=" + student.getName());  

 hibernate查詢(xún)緩存

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

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

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

查詢(xún)緩存代碼
  1. Query query = session.createQuery("select s.name from Student s");   
  2. //啟用查詢(xún)查詢(xún)緩存   
  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. //啟用查詢(xún)查詢(xún)緩存   
  14. query.setCacheable(true);   
  15.   
  16. //沒(méi)有發(fā)出查詢(xún)sql,因為啟用了查詢(xú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ù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
hibernate緩存
hibernate的一級緩存
hibernate--lazy(懶加載)屬性
hql語(yǔ)言實(shí)體對象查詢(xún)(二)
9、領(lǐng)域對象的三種狀態(tài)
hibernate延時(shí)加載的代理對象
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久