Java 如何使用hibernate会话?

Java 如何使用hibernate会话?,java,hibernate,nhibernate,Java,Hibernate,Nhibernate,我的课程结构如下: 在我的主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() /

我的课程结构如下:

在我的主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访问数据库1。我的问题是我应该如何使用hibernate会话来访问它。我应该什么时候开始,什么时候结束

如果我在for()循环之前启动它,是否可以在function1()访问同一数据库时将同一会话传递给它?或者,一旦我选择(第1行),我必须关闭它并在function1()中打开一个新会话? 优化总体性能和最小化总体执行时间是我主要关心的问题


我刚开始冬眠。因此,如果我问了一个非常愚蠢的问题,请原谅。

假设您希望所有更新都是一个原子事务,那么您需要打开会话并在循环之前开始一个事务。然后,在循环完成后,您需要提交事务并关闭会话


如果每个更新都应该是它自己的原子事务,那么您仍然应该只打开一个会话,然后为循环的每个迭代使用一个新的事务。

会话抽象db连接,对于您的示例来说,为每个迭代步骤创建一个会话不是一个好的做法,这是一种开销。相反,使用getCurrentSession()打开一个新会话或获取现有会话。此外,使用连接池(如C3P0)来管理数据库连接仍然是一种很好的做法。建立到数据库的连接是昂贵的

如果选择抓取迭代之间不同的10K记录,则在整个操作中使用同一会话时,Hibernate会话中可能会有50M个对象


您可能希望在每次迭代后至少刷新并清除会话。

是。它会将挂起的更改写入数据库并清除缓存。这就是重点。内存中有5000万个对象是很多的,除非你的对象真的很小。原子事务的含义是什么,是单个事务吗D