繁体   English   中英

如何使用hibernate会话?

[英]How to use hibernate sessions?

我的程序结构如下:

在我的主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的新手。 因此,如果我问一个非常愚蠢的怀疑,请原谅我。

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

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

会话抽象数据库连接,对于您的示例来说,为每个迭代步骤创建会话并不是一个好习惯,这是开销。 而是使用getCurrentSession()打开一个新会话或获取现有会话。此外,使用像C3P0这样的连接池来管理数据库连接仍然是一个好习惯。 建立与DB的连接是昂贵的。

如果您选择抓取迭代之间不同的10K记录,那么当您对整个操作使用相同的会话时,最终可能会在Hibernate会话中使用50M对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM