【问题标题】:How to make Hibernate SessionFactory checkout JDBC connection from c3p0 upon session opening?如何在会话打开时从 c3p0 使 Hibernate SessionFactory 签出 JDBC 连接?
【发布时间】:2014-05-08 11:53:50
【问题描述】:

这很有用,因为我想知道池是否已用尽,然后才需要在我的 DAO 中从 Session 创建事务。

我想向用户提供有关系统过载(池耗尽)的反馈,但我不想在每个 DAO 的每个方法中都捕获这个特定的异常。我认为开会是检查这一点的合适时机。

【问题讨论】:

    标签: java hibernate connection c3p0 sessionfactory


    【解决方案1】:

    较新版本的 Hibernate 具有此数据库连接属性:

     hibernate.connection.acquisition_mode
    

    可以设置为IMMEDIATELY,因此

    "Hibernate Session 结束后将立即获取 Connection 打开。这也绕过了 ConnectionReleaseMode,因为 Connection 然后将一直保留到 Session 结束。”

    【讨论】:

      【解决方案2】:

      Hibernate 最好使用尽可能短的数据库连接。在打开会话时声明数据库连接与此相反(没有可用于执行的查询,这将在稍后出现)。副作用是池会更快耗尽。

      c3p0 使用checkoutTimeout 来确定在连接池耗尽时等待连接变为可用的时间。默认情况下,此超时为 0(即无超时),但如果将其设置为另一个值(例如 50 000 毫秒)并且达到超时,则会抛出 SQLException

      您可以尝试进行有根据的猜测,看看是否会在开始事务之前到达checkoutTimeout,但这始终是猜测:这取决于其他事务完成的速度。
      要进行猜测,您可以使用 c3p0 的 JMX interface 并获取连接数 (NumConnections)、繁忙连接数 (NumBusyConnections) 和等待连接的线程数 (@ 987654325@)。
      如果有很多繁忙的连接并且有很多线程在等待,很有可能会到达checkoutTimeout,但您必须通过压力测试确定确切的数字。

      【讨论】:

        猜你喜欢
        • 2022-08-09
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 2013-03-14
        • 2010-11-25
        • 1970-01-01
        • 2015-01-07
        • 2021-05-18
        相关资源
        最近更新 更多