2011-05-10 76 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