作者awert ( )
看板java
标题Re: [问题] hibernate的新手问题
时间Tue Dec 18 00:04:43 2012
※ 引述《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
1F:推 kevindd:多谢回答 可以提一下大量DB操作的实作方式吗?或者是 12/18 00:32
2F:→ kevindd:resourse 我在书上只看到用分页 不过好像是 12/18 00:33
3F:→ kevindd:resultSet太大的解决问题 12/18 00:34
4F:→ awert:google 12/19 00:06