【问题标题】:Configure Hibernate to obtain a fresh connection from a connection pool配置 Hibernate 以从连接池中获取新连接
【发布时间】:2011-02-08 13:22:40
【问题描述】:

如何配置 Hibernate,以便每次调用 sessionFactory.openSession() 时,它都会从连接池中连接一个新连接?连接池由 Websphere Application Server 管理,是一个 JDBC 数据源。

谢谢

【问题讨论】:

  • 这个要求的原因是什么?为了避免池中的陈旧连接?
  • 我需要在 Web 应用程序的单个请求中打开 2 个会话。现在,两个会话似乎都在使用相同的连接,因为当第一个会话关闭时(有时手动调用 session.close()),另一个会话在尝试运行更多查询时会抛出“会话关闭”异常它。第二个会话由子线程打开,这意味着子线程即使在 (HTTP) 请求完成后也可以继续存在。
  • 你能在问题仍然存在的地方显示一个简化的代码吗?我认为会话是 1:不是线程安全的,您不应该将会话对象传递给另一个线程。 2:线程绑定(取决于您使用的 tx mgnt 堆栈)。您是否在同一个线程中打开两个会话?如果是,请尝试在不同的线程中打开它们中的每一个
  • 我在 2 个不同的线程中打开 2 个会话。

标签: java hibernate orm jdbc websphere


【解决方案1】:

如何配置 Hibernate,以便每次调用 sessionFactory.openSession() 时,它都会连接来自连接池的新连接?

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

现在看来,两个会话都在使用同一个连接,因为有时当第一个会话关闭时(手动调用 session.close()),另一个会话在尝试运行时会抛出“会话关闭”异常更多查询。

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

第二个会话由子线程打开,这意味着子线程即使在 (HTTP) 请求完成后也可以继续存在。

相信我之前的建议,你不应该产生unmanaged threads,而且我不知道应用程序服务器会如何运行。我在this other answer 中解释了正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2011-05-28
    • 2015-06-16
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多