[原创]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 对象的生命周期与本地线程绑定...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络流量监控分析工具 Ntopng 安装
- 下一篇: 交货单开票