2017-03-23 29 views
2

我提到了很多文章,但仍然不清楚session.clear在hibernate中的表現。session.clear()如何在Hibernate中工作

據我隔着那麼遠就是來了, 當我們使用批量保存/更新,如下圖所示:

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) { 
    Employee employee = new Employee(.....); 
    session.save(employee); 
    if(i % 50 == 0) { // Same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 
tx.commit(); 
session.close(); 

sesion.flush();法拉盛會話的力量是用來休眠到內存中狀態同步與數據庫的會話。

問題

沖洗會議結束後,爲什麼有必要做session.clear()?它真的需要嗎?

2.請問session.clear()執行提交操作?

3.如果session.clear()驅逐所有加載的對象,執行提交和回滾操作時內部發生了什麼?

回答

4

將會話視爲您已啓動當前事務後已從數據庫加載(或保留)到數據庫的實體緩存。

  1. Session.clear是不以任何方式強制的,但如果你做了很多裝載實體的/一個事務中保存,以避免收到內存不足的錯誤是非常有用的。在你的例子中,你將在會話中複製50 employee個實體。如果沒有flushclear方法調用每50 50 save()您將有100.000實體複製在會話中(而不是垃圾回收,因爲會話有一個鏈接到實體)。

  2. Session.clear將不會執行提交或回滾。 。甚至沒有flush(所以爲什麼你應該在Session.clear之前做沖洗,使休眠未決實體更新生成SQL查詢

  3. 回滾或提交操作不會對應用端進行的,但在數據庫:Hibernate會只是要求數據庫提交或回滾(Hibernate可能會在提交操作之前觸發刷新,但刷新不是提交的一部分)。提交操作不會(也不能)訪問會話,它是一個數據庫內部機制,該機制將持續(或恢復)自從事務開始以來運行的所有SQL查詢所執行的數據修改

完全一樣,在hibernate中打開一個事務並沒有執行很多事情:主要是將一個db連接從池中取出,並告訴數據庫到而不是auto_commit下面是sql查詢,但是要等待提交或回滾命令。