国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Hibernate管理Session和批量操作分析

2019-11-26 15:20:48
字體:
來源:轉載
供稿:網友

本文詳細分析了Hibernate管理Session和批量操作的用法。分享給大家供大家參考。具體分析如下:

Hibernate管理Session

Hibernate自身提供了三種管理Session對象的方法
① Session對象的生命周期與本地線程綁定
② Session對象的生命周期與JTA事務綁定
③ Hibernate委托程序管理Session對象的生命周期


在Hibernate的配置文件中,hibernate.current_session_context_class屬性用于指定Session管理方式,可選值包括:
① thread:Session對象的生命周期與本地線程綁定
② jta*:Session對象的生命周期與JTA事務綁定
③ managed:Hibernate委托程序來管理Session對象的生命周期

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


Hibernate按以下規則把Session與本地線程綁定:
當一個線程(thread)第一次調用SessionFactory對象的getCurrentSession()方法時,該方法會創建一個新的Session(sessionA)對象,把該對象與threadA綁定,并將session返回
當threadA再次調用SessionFactory對象的getCurrentSession()方法時,該方法將返回sessionA對象
當threadA提交sessionA對象關聯的事務時,Hibernate會自動flush sessionA對象的緩存,然后提交事務,關閉session隨心。當threadA撤銷sessionA對象關聯的事務時,也會自動關閉sessionA對象
若threadA再次調用SessionFactory對象的getCurrentSession()方法時,該方法會又創建一個新的Session(sessionB)對象,把該對象與threadA綁定,并將sessionB返回

批量處理數據

批量處理數據是指在一個事務中處理大量數據
在應用層進程批量操作,主要有以下方式:
① 通過Session
② 通過HQL
③ 通過StatelessSession
④ 通過JDBC API----推薦此種,因為速度最快

Session進行批量操作:

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

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

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

若對象采用"identity"標識生成器,則Hibernate無法在JDBC曾進行批量插入操作

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

批量插入數據代碼演示:

復制代碼 代碼如下:
News news = null;
for(int i = 0; i < 10000; i++) {
    news = new News();
    news.setTitle("--" + i);

    session.save(news);
    if((i + 1) % 20 == 0) {
        session.flush();
        session.clear();
    }
}

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

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

通過HQL進行批量操作:

注意:HQL只支持INSERT INTO ... SELECT形式的插入語句,但不支持INSERT INTO ... VALUES形式的插入語句。所以使用HQL不能進行批量插入操作

通過StatelessSession進行批量操作:

從形式上看,StatelessSession與Session的用法類似。StatelessSession與Session相比,有以下區別:

StatelessSession沒有緩存,通過StatelessSession來加載、保存或更新后的對象處于游離狀態
StatelessSession不會與Hibernate的二級緩存交互
當調用StatelessSession的save()、update()或delete()方法時,這些方法會立即執行相應的SQL語句,而不會僅計劃執行一條SQL語句
StatelessSession不會進行臟檢查,因此修改了Customer對象屬性后,還需要調用StatelessSession的update()方法來更新數據庫中數據
StatelessSession不會對關聯的對象進行任何的級聯操作
通過同一個StatelessSession對象兩次加載的OID為1的Customer對象,得到的兩個對象內存地址不同
StatelessSession所做的操作可以被Interceptor攔截器捕獲到,但是會被Hibernate的事件處理系統忽略掉

希望本文所述對大家的Java程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 繁昌县| 卓资县| 云梦县| 正蓝旗| 茂名市| 乐清市| 莎车县| 丁青县| 土默特右旗| 陇川县| 常州市| 襄樊市| 德钦县| 海丰县| 会泽县| 鹰潭市| 赣州市| 崇礼县| 曲松县| 上饶市| 灵石县| 太谷县| 东阿县| 晋中市| 霍邱县| 澄城县| 阜平县| 郴州市| 庆阳市| 绥滨县| 奉节县| 丁青县| 唐山市| 双辽市| 淮安市| 墨脱县| 定州市| 南京市| 大姚县| 会昌县| 余姚市|