2011-05-10 79 views
3

我的程序的結構如下:如何使用休眠會話?

裏面我主要的java類:

for() // this will execute for say 5000 times ---- LINE 1 
{ 
    // do select on Database1 (this will select say 10000 rows) ---- LINE 2 

    // do some computations (mainly string operations) ---- LINE 3 

    call function1() // this will do some update on Database1 ---- LINE 4 
} 

現在,我試圖訪問數據庫1使用Hibernate。我的問題是我應該如何使用hibernate會話來訪問它。我應該什麼時候開始會議,什麼時候該結束?

如果我在for()循環之前啓動它,我可以將相同的會話傳遞給function1(),因爲它正在訪問相同的數據庫嗎?或者一旦我選擇了(LINE 1),我必須關閉它並在function1()中打開一個新的會話?我最關心的是優化整體性能並儘量減少整體執行時間。

我是Hibernate的新手。因此,如果我提出一個非常愚蠢的疑問,請原諒我。

回答

4

假設您希望所有更新都是單個原子事務,您需要打開會話並在循環之前開始事務。然後,在循環之後,您將要提交事務並關閉會話。

如果每個更新都應該是它自己的原子事務,那麼您仍然應該只打開一個Session,然後爲每個迭代循環使用一個新的事務。

+0

原子事務的含義是什麼,是單一事務? :D – gumuruh 2011-11-24 10:02:38

+0

[http://en.wikipedia.org/wiki/Atomicity_(database_systems)](http://en.wikipedia.org/wiki/Atomicity_(database_systems)) – Jeremy 2011-11-24 17:04:05

1

會話會抽象出db連接,對於您的示例來說,爲每個迭代步驟創建一個會話並不是一個好習慣,但它是開銷。相反,打開一個新的會話或使用getCurrentSession()獲取現有的會話。此外,使用像C3P0這樣的連接池來管理數據庫連接仍然是一個好習慣。建立與DB的連接非常昂貴。

+0

感謝提示,@Erhan – gumuruh 2011-12-12 07:04:07

1

如果您選擇抓取迭代次數不同的10K記錄,那麼當您爲整個操作使用相同的會話時,最終可能會在Hibernate會話中產生50M個對象。

您可能希望至少在每次迭代後刷新並清除會話。

+0

will the刷新或清除影響緩存? – Bhushan 2011-05-11 15:58:10

+0

是的。它會將待處理的更改寫入數據庫並清除緩存。這是重點。內存中的50M對象很多,除非你的對象真的很小。 – Olaf 2011-05-11 16:08:12