日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...

發布時間:2024/1/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本博客的目的:①總結自己的學習過程,相當于學習筆記 ②將自己的經驗分享給大家,相互學習,互相交流,不可商用

內容難免出現問題,歡迎指正,交流,探討,可以留言,也可以通過以下方式聯系。

本人互聯網技術愛好者,互聯網技術發燒友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.管理 Session

  1)Hibernate 自身提供了三種管理 Session 對象的方法

    ①?Session 對象的生命周期與本地線程綁定

    ②?Session 對象的生命周期與 JTA 事務綁定

    ③?Hibernate 委托程序管理 Session 對象的生命周期

  2)在 Hibernate 的配置文件中,hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包括

    ①?thread: Session 對象的生命周期與本地線程綁定

    ②?jta*: Session 對象的生命周期與 JTA 事務綁定

    ③?managed: Hibernate 委托程序來管理 Session 對象的生命周期

?

2.Session 對象的生命周期與本地線程綁定

  1)如果把 Hibernate 配置文件的 hibernate.current_session_context_class 屬性值設為 thread, Hibernate 就會按照與本地線程綁定的方式來管理 Session

  2)Hibernate 按一下規則把 Session 與本地線程綁定

    ①?當一個線程(threadA)第一次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法會創建一個新的 Session(sessionA) 對象, 把該對象與 threadA 綁定, 并將 sessionA 返回

    ??②?當 threadA 再次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法將返回 sessionA 對象

    ③?當 threadA 提交 sessionA 對象關聯的事務時, Hibernate 會自動flush sessionA 對象的緩存, 然后提交事務, 關閉 sessionA 對象. 當 threadA 撤銷 sessionA 對象關聯的事務時, 也會自動關閉 sessionA 對象

    ④?若 threadA 再次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法會又創建一個新的 Session(sessionB) 對象, 把該對象與 threadA 綁定, 并將 sessionB 返回

通過單例模式創建一個HibernateUtils 工具類

1 package com.jason.hibernate.dao; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.hibernate.service.ServiceRegistry; 7 import org.hibernate.service.ServiceRegistryBuilder; 8 9 public class HibernateUtils { 10 11 private HibernateUtils(){} 12 13 private static HibernateUtils instance = new HibernateUtils(); 14 15 private SessionFactory sessionFactory; 16 17 public static HibernateUtils getInstance(){ 18 return instance; 19 } 20 21 private SessionFactory getsSessionFactory(){ 22 23 if(sessionFactory == null){ 24 Configuration configuration = new Configuration().configure(); 25 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 26 .applySettings(configuration.getProperties()) 27 .buildServiceRegistry(); 28 29 sessionFactory = configuration.buildSessionFactory(serviceRegistry); 30 } 31 32 return sessionFactory; 33 } 34 35 36 public Session getsSession(){ 37 return getsSessionFactory().getCurrentSession(); 38 } 39 40 41 42 43 }

?

?

3.批量處理數據

  1)批量處理數據是指在一個事務中處理大量數據.

  2)在應用層進行批量操作, 主要有以下方式: ??通過 Session; 通過 HQL; 通過 StatelessSession; 通過 JDBC API;

  

  3)通過 Session 來進行批量操作

    ①?Session 的 save() 及 update() 方法都會把處理的對象存放在自己的緩存中. 如果通過一個 Session 對象來處理大量持久化對象, 應該及時從緩存中清空已經處理完畢并且不會再訪問的對象. 具體的做法是在處理完一個對象或小批量對象后, 立即調用 flush() 方法刷新緩存, 然后在調用 clear() 方法清空緩存

  

    ②?通過 Session 來進行處理操作會受到以下約束

     >?需要在 Hibernate 配置文件中設置 JDBC 單次批量處理的數目, 應保證每次向數據庫發送的批量的 SQL 語句數目與 batch_size 屬性一致

     >?若對象采用 “identity” 標識符生成器, 則 Hibernate 無法在 JDBC 層進行批量插入操作

     > ?進行批量操作時, 建議關閉 Hibernate 的二級緩存

?

    ③?批量更新: 在進行批量更新時, 如果一下子把所有對象都加載到 Session 緩存, 然后再緩存中一一更新, 顯然是不可取的;

     使用可滾動的結果集 org.hibernate.ScrollableResults, 該對象中實際上并不包含任何對象, 只包含用于在線定位記錄的游標. 只有當程序遍歷訪問 ScrollableResults 對象的特定元素時, 它才會到數據庫中加載相應的對象.

    

4.通過 HQL 來進行批量操作:HQL 只支持 INSERT INTO … SELECT 形式的插入語句, 但不支持 INSERT INTO … VALUES 形式的插入語句. 所以使用 HQL 不能進行批量插入操作

?

5.通過StatelessSession來進行批量操作:從形式上看,StatelessSession與session的用法類似

    StatelessSession與session相比,有以下區別:

    1)StatelessSession沒有緩存,通過StatelessSession來加載、保存或更新后的對象處于游離狀態

    2)StatelessSession不會與Hibernate的第二級緩存交互。

    3)當調用StatelessSession的save()、update()或delete()方法時,這些方法會立即執行相應的SQL語句,而不會僅計劃執行一條SQL語句

    4)StatelessSession不會進行臟檢查,因此修改了Customer對象屬性后,還需要調用StatelessSession的update()方法來更新數據庫中數據。

    5)StatelessSession不會對關聯的對象進行任何級聯操作。

    6)通過同一個StatelessSession對象兩次加載OID為1的Customer對象,得到的兩個對象內存地址不同。

    7)StatelessSession所做的操作可以被Interceptor攔截器捕獲到,但是會被Hibernate的事件處理系統忽略掉。

?

轉載于:https://www.cnblogs.com/jasonHome/p/5937028.html

總結

以上是生活随笔為你收集整理的[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。