最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate管理Session和批量操作分析

 更新時間:2014年12月04日 14:44:05   投稿:shichen2014  
這篇文章主要介紹了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量處理數(shù)據(jù)等的常用技巧及注意事項,具有一定的參考借鑒價值,需要的朋友可以參考下

本文詳細分析了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按以下規(guī)則把Session與本地線程綁定:
當一個線程(thread)第一次調(diào)用SessionFactory對象的getCurrentSession()方法時,該方法會創(chuàng)建一個新的Session(sessionA)對象,把該對象與threadA綁定,并將session返回
當threadA再次調(diào)用SessionFactory對象的getCurrentSession()方法時,該方法將返回sessionA對象
當threadA提交sessionA對象關聯(lián)的事務時,Hibernate會自動flush sessionA對象的緩存,然后提交事務,關閉session隨心。當threadA撤銷sessionA對象關聯(lián)的事務時,也會自動關閉sessionA對象
若threadA再次調(diào)用SessionFactory對象的getCurrentSession()方法時,該方法會又創(chuàng)建一個新的Session(sessionB)對象,把該對象與threadA綁定,并將sessionB返回

批量處理數(shù)據(jù)

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

Session進行批量操作:

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

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

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

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

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

批量插入數(shù)據(jù)代碼演示:

復制代碼 代碼如下:
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緩存,然后再緩存中一一更新,顯然是不可取的

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

通過HQL進行批量操作:

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

通過StatelessSession進行批量操作:

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

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

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

相關文章

  • Java 反射機制知識詳細介紹及總結(jié)

    Java 反射機制知識詳細介紹及總結(jié)

    反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制
    2017-01-01
  • 帶你了解Spring中bean的獲取

    帶你了解Spring中bean的獲取

    這篇文章主要介紹了Spring在代碼中獲取bean的幾種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • Spring?Boot配置內(nèi)容加密實現(xiàn)敏感信息保護

    Spring?Boot配置內(nèi)容加密實現(xiàn)敏感信息保護

    之前我們講過的配置相關知識都是Spring?Boot原生就提供的,而今天我們將介紹的功能并非Spring?Boot原生就支持,但卻非常有用:配置內(nèi)容的加密
    2021-11-11
  • SpringBoot自定義監(jiān)聽器的項目實踐

    SpringBoot自定義監(jiān)聽器的項目實踐

    Spring Boot提供了強大的事件模型,其中包括多種內(nèi)置監(jiān)聽器,同時也支持開發(fā)者自定義監(jiān)聽器,下面就來介紹下SpringBoot自定義監(jiān)聽器,感興趣的可以了解一下
    2024-03-03
  • SpringBoot實現(xiàn)文件上傳下載實時進度條功能(附源碼)

    SpringBoot實現(xiàn)文件上傳下載實時進度條功能(附源碼)

    這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)文件上傳下載實時進度條功能,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2022-10-10
  • 淺談Java的WeakHashMap源碼

    淺談Java的WeakHashMap源碼

    這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會被GC自動刪除,即使程序員沒有調(diào)用remove()或者clear()方法,需要的朋友可以參考下
    2023-09-09
  • springboot常用語法庫的基本語法

    springboot常用語法庫的基本語法

    FreeMarker 是一款?模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具,這篇文章主要介紹了springboot常用語法庫的基本語法,需要的朋友可以參考下
    2022-12-12
  • JAVA使用quartz添加定時任務,并依賴注入對象操作

    JAVA使用quartz添加定時任務,并依賴注入對象操作

    這篇文章主要介紹了JAVA使用quartz添加定時任務,并依賴注入對象操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 如何使用Spring-Test對Spring框架進行單元測試

    如何使用Spring-Test對Spring框架進行單元測試

    這篇文章主要介紹了如何使用Spring-Test對Spring框架進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用JAVA命令運行JAR包以及日志輸出詳解

    使用JAVA命令運行JAR包以及日志輸出詳解

    這篇文章主要給大家介紹了關于使用JAVA命令運行JAR包以及日志輸出的相關資料,文中通過代碼示例介紹的非常詳細,對大家學習或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

南川市| 长宁县| 赣州市| 洞头县| 布拖县| 扶绥县| 高尔夫| 北流市| 衡阳市| 阳高县| 大安市| 桃源县| 宜黄县| 新泰市| 玛多县| 浦东新区| 长兴县| 清涧县| 晋州市| 康保县| 罗平县| 阜南县| 大石桥市| 邵东县| 页游| 商丘市| 紫云| 莫力| 育儿| 临颍县| 玉屏| 霍邱县| 张掖市| 修武县| 榕江县| 静乐县| 伊金霍洛旗| 乡城县| 曲松县| 云龙县| 天祝|