【问题标题】:hibernate session handling with lazy loading带有延迟加载的休眠会话处理
【发布时间】:2013-09-30 06:03:13
【问题描述】:

我在多对多关联中使用带有 JPA 和layz 加载的休眠 4.2.4。 对象 A 与 @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) 相关联,反之亦然。为了从数据库中获取数据,我调用了以下(简化的)代码:

try {
   session = cutSessionFactory.openSession();
   session.beginTransaction();
   List<IBO> result = session.createQuery(query).list();
   session.getTransaction().commit();
   return result;
catch{...}
finally{
   session.close;
}

最初我是让连接打开的,因为如果我的应用程序需要做一些延迟加载,那么在第一次调用之后仍然需要会话。但是,虽然这使我的应用程序在某些操作后冻结,但我偶然采用了以前的策略。现在一切正常;没有冻结,延迟加载没有问题。 但是,如果我加载一个实体,它有一些子项(需要延迟加载),日志会显示:

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

紧随其后

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@15f52a7
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out

休眠没有关闭会话是有道理的(实际上我认为有一个使用新会话的延迟加载的新请求)连接池识别出有一个未使用的会话。但最终hibernate正在修复我的“糟糕的会话处理”。

那么有谁知道处理延迟加载会话的更好方法?

【问题讨论】:

  • 你找到答案了吗?当您看到此警告时,连接(来自 c3p0)是否已关闭?还是有连接池泄漏?

标签: hibernate


【解决方案1】:

当然我们需要关闭会话,否则应用程序可能无法正常工作。

此外,我们应该尽量保持嵌套对象惰性以获得更好的性能并添加强制连接。

如果您需要访问子元素,您必须在查询中应用联接,以便加载惰性对象,例如:

class A{
      B b;
}

sql:

select * from A Left join B on A.bid = B.id

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2014-08-08
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多