我的程序结构如下:
在我的主要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
}
现在,我正在尝试使用Hibernate访问Database1。我的问题是我应该如何使用hibernate会话来访问它。我应该何时开始会议,何时结束呢?
如果我在for()循环之前启动它,我可以将同一个会话传递给function1(),因为它访问同一个数据库吗?或者一旦我做了选择(LINE 1),我必须关闭它并在function1()中打开一个新的会话? 优化整体性能并最大限度地缩短总体执行时间是我的主要关注点。
我是Hibernate的新手。因此,如果我问一个非常愚蠢的怀疑,请原谅我。
答案 0 :(得分:5)
假设您希望所有更新都是单个原子事务,则需要打开Session并在循环之前开始事务。然后,在循环之后,您将要提交事务并关闭会话。
如果每个更新都应该是它自己的原子事务,那么你仍然应该只打开一个Session,然后为循环的每次迭代使用一个新的事务。
答案 1 :(得分:1)
会话抽象数据库连接,对于您的示例来说,为每个迭代步骤创建会话并不是一个好习惯,这是开销。而是使用getCurrentSession()打开一个新会话或获取现有会话。此外,使用像C3P0这样的连接池来管理数据库连接仍然是一个好习惯。建立与DB的连接是昂贵的。
答案 2 :(得分:1)
如果您选择抓取迭代之间不同的10K记录,那么当您对整个操作使用相同的会话时,最终可能会在Hibernate会话中使用50M对象。
您可能希望在每次迭代后至少刷新并清除会话。