Re: [問題] hibernate的新手問題
※ 引述《kevindd (gg)》之銘言:
: 最近在用hibernate但是有些不太懂的地方
: 我看文件說明要求session per request不鼓勵session per operation
: 但是我不太清楚session per request的定義
其實 session per request / session per operation 並不是什麼專有名詞,它比較像
在建議你,要怎樣用才會比較有效率的使用程式裡的資源。以你的問題來講,資源就是指
你每次要存取 DB 所開啟的 hibernate session。畢竟 Database 是個外部資源,總是比
較吃資源和耗費時間。
舉個例來講 :
你的程式是一個討論區 web application。
使用者在寫完一篇文章時,按下新增時,你的程式會做兩件事 :
1. 將使用者的文章存入 DB。
2. 更新 DB 裡資料統計結果,例如使用者總文章數。
Java method 可能會像這個樣子
public void createPost(Post post) {
// Insert post into Database
...
// Update statistics data
...
}
request 就如同呼叫 createPost(),operation 就如新增 Post 和更新統計資料。
假設程式裡沒有使用 Connection Pool ,也沒有做 Transaction 管理。每個 operation
都會自己去開啟 session,做完後就關掉。這樣子等於每呼叫 createPost() 一次就會有
兩個 session 建立起來又關閉。
程式很小或使用的人少時可能感覺還好。但只要程式開始成長,operation 變多,變複雜
的時候,session 就會不斷的被開啟又關閉,甚至是被一直留住直到所有 operation 結束
才關掉,這些多拿的 session 是非常浪費系統資源的,甚至沒兩下就 Connection 最
大值吃光,因為都佔著不放。
因此它才會說,一個 request 用一個 session 為佳。
: 舉例來說 我建立1個session後 針對同樣db但table不同的query重複使用session
: 一直到沒有queryStr後才執行session.close()
: 這樣有符合session per request嗎?
: 如果queryStr有很多筆 不會有out of memory問題嗎?
前後這兩句沒有什麼關聯,所以我也不曉得要怎麼回答你。但是大量的DB操作通常也都有
另外的實作方式。
: 還有另一個問題
: 下面程式片段中session2的openSession()和close()是否要放在while loop裡才合理?
見前面解釋
--
We who cut mere stones must always be envisioning cathedrals.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.186.241
推
12/18 00:32, , 1F
12/18 00:32, 1F
→
12/18 00:33, , 2F
12/18 00:33, 2F
→
12/18 00:34, , 3F
12/18 00:34, 3F
→
12/19 00:06, , 4F
12/19 00:06, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):