【发布时间】:2014-05-08 11:53:50
【问题描述】:
这很有用,因为我想知道池是否已用尽,然后才需要在我的 DAO 中从 Session 创建事务。
我想向用户提供有关系统过载(池耗尽)的反馈,但我不想在每个 DAO 的每个方法中都捕获这个特定的异常。我认为开会是检查这一点的合适时机。
【问题讨论】:
标签: java hibernate connection c3p0 sessionfactory
这很有用,因为我想知道池是否已用尽,然后才需要在我的 DAO 中从 Session 创建事务。
我想向用户提供有关系统过载(池耗尽)的反馈,但我不想在每个 DAO 的每个方法中都捕获这个特定的异常。我认为开会是检查这一点的合适时机。
【问题讨论】:
标签: java hibernate connection c3p0 sessionfactory
较新版本的 Hibernate 具有此数据库连接属性:
hibernate.connection.acquisition_mode
可以设置为IMMEDIATELY,因此
"Hibernate Session 结束后将立即获取 Connection 打开。这也绕过了 ConnectionReleaseMode,因为 Connection 然后将一直保留到 Session 结束。”
【讨论】:
Hibernate 最好使用尽可能短的数据库连接。在打开会话时声明数据库连接与此相反(没有可用于执行的查询,这将在稍后出现)。副作用是池会更快耗尽。
c3p0 使用checkoutTimeout 来确定在连接池耗尽时等待连接变为可用的时间。默认情况下,此超时为 0(即无超时),但如果将其设置为另一个值(例如 50 000 毫秒)并且达到超时,则会抛出 SQLException。
您可以尝试进行有根据的猜测,看看是否会在开始事务之前到达checkoutTimeout,但这始终是猜测:这取决于其他事务完成的速度。
要进行猜测,您可以使用 c3p0 的 JMX interface 并获取连接数 (NumConnections)、繁忙连接数 (NumBusyConnections) 和等待连接的线程数 (@ 987654325@)。
如果有很多繁忙的连接并且有很多线程在等待,很有可能会到达checkoutTimeout,但您必须通过压力测试确定确切的数字。
【讨论】: