2010-04-15 83 views
1

如何配置Hibernate以便每次调用sessionFactory.openSession()时都将它与来自连接池的新连接进行连接?连接池由Websphere Application Server管理,并且是JDBC数据源。配置休眠以获得连接池中的全新连接

感谢

+1

这个要求的原因是什么?为了避免游泳池中陈旧的连接? – 2010-04-15 19:47:07

+0

我需要在Web应用程序中的单个请求中打开2个会话。现在,看起来两个会话都使用相同的连接,因为有时会关闭第一个会话(手动调用session.close()),另一个会话在尝试运行更多查询时会引发“会话关闭”异常它。第二个会话由一个子线程打开,这意味着即使(HTTP)请求完成后,子线程也可以保持活动状态。 – 2010-04-15 20:22:44

+0

您能否在问题持续存在的地方显示简化的代码?我认为会话是1:不是线程安全的,你不应该将会话对象传递给另一个线程。 2:线程绑定(取决于您使用的tx mgnt堆栈)。你是否在同一个线程中打开两个会话?如果是的话尝试在不同的线程中打开它们中的每一个 – Thierry 2010-04-15 21:25:04

回答

2

如何配置Hibernate这样每次我打电话sessionFactory.openSession()它与连接池一个新的连接连接?

这是默认行为,每个会话将从连接池获得专用连接。

现在,看起来两个会话都使用相同的连接,因为当第一个会话有时关闭(手动调用session.close())时,其他会话将在会话时引发“会话关闭”异常试图运行更多的查询。

不,他们不是。但是也许第二个连接在为请求启动的事务结束时被释放。看看hibernate.connection.release_modeconfiguration parameter,你可能想用on_close。但没有关于交易策略的更多细节,就不可能说出任何内容。

第二个会话由子线程打开,这意味着即使(HTTP)请求完成后子线程仍可以保持活动状态。

以我以前的建议与一粒盐,你应该不会产卵unmanaged threads,我不知道应用服务器将如何表现。我在this other answer中解释什么是正确的方法。

+0

非常感谢,我得到了它的工作。 – 2010-04-16 15:14:36

+0

@ferrari不客气。很高兴它的工作。 – 2010-04-16 15:31:45