一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Hibernate管理Session和批量操作分析

Hibernate管理Session和批量操作分析

2019-12-06 14:04shichen2014 JAVA教程

這篇文章主要介紹了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量處理數據等的常用技巧及注意事項,具有一定的參考借鑒價值,需要的朋友可以參考下

本文詳細分析了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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人免费观看www视频 | 国产精品久久久久久搜索 | 国产免费一区二区三区 | 国产精品国产三级国产专区不 | 朝鲜女人free性hu | 国产免费看黄的私人影院 | 国产精品对白刺激久久久 | 日本中文字幕高清 | 大伊香蕉在线精品不卡视频 | 99九九国产精品免费视频 | 情乱奶水欲 | 无码欧美喷潮福利XXXX | 精品国产自在天天线2019 | 日本www色视频成人免费 | 日本视频免费在线 | 成人午夜毛片 | 爆操俄罗斯美女 | 日韩 国产 欧美 | 日本三级做a全过程在线观看 | 男人影院天堂网址 | 免费一级片在线 | 精品国产自在现线拍400部 | avtt在线观看 | 日韩欧美推理片免费在线播放 | 久久久久影视 | 超级乱淫 不详 | 精品国产原创在线观看视频 | 色偷偷91久久综合噜噜噜 | 好大好热 | 欧美在线成人免费国产 | 精品亚洲一区二区三区在线播放 | 国产精品成人免费 | 免费又爽又黄禁片视频在线播放 | 日本无遮挡亲吻膜下面免费 | 亚洲精品一区二区三区在线看 | 公园暴露娇妻小说 | 亚洲精品久久久久久婷婷 | 国内精品露脸在线视频播放 | 吻戏辣妞范1000免费体验 | 亚洲日本视频在线观看 | 男生操女生漫画 |