2013-10-29 152 views
2

我正在使用Hibernatec3p0进行连接池。由于我在多网状数据库环境中工作,并且碎片停机时间的可能性是一个现实的用例场景(通过手头应用程序外部的方式,例如某人只是因为某种原因无视碎片),所以我试图让c3p0一旦它检测到数据库连接已关闭,就会显式关闭Hibernate会话,这样我就可以在多分片扫描中跳过特定的分片会话。配置c3p0在连接关闭时关闭休眠会话

有没有办法配置c3p0通知Hibernate,调用Session.close()一旦发现连接已关闭,以致调用Session.isOpen()可以返回一个有意义的布尔值?

相关:Preemptively and gracefully check that org.hibernate.Session is still connected (via c3p0)

回答

3

简单的答案是否定的,C3P0不会帮助你在这里。

听起来像(看这里和你以前的问题)你正在做一些跨越c3p0的工作,那就是你持有长寿的Sessions而不是按照需要创建Sessions,然后及时摧毁他们。那种事情非常脆弱。它是存在避免的架构连接池。

你最好的选择,国际海事组织,将是“不这样做”。永远不要缓存会话。那么普通的连接测试(可能还会设置checkoutTimeout)将解决问题。如果分片关闭,尝试获取连接将失败,如果这是最佳解决方法,则可以跳过分片。

c3p0对hibernate一无所知。 c3p0的作者感谢hibernate推广他的(我的)图书馆,但c3p0不知道Session是什么,只是一个连接。从理论上讲,c3p0可以帮助你的唯一方法就是当它发现数据库关闭(根据你的配置可能相当迅速或相当缓慢)时它可以向你报告事件。您可以通过close()会话来响应该事件。

不幸的是,c3p0还没有提供钩子,用户可以通过钩子来响应采集失败。它可能—这是我正在考虑添加0.9.6的功能。但现在不是。然而,实现轮询你的分片并自己关闭Sessions的事情是相当微不足道的。所有c3p0都会注意到中断是调用DriverManager.getConnection(...)或dataSource.getConnection()并观察异常。你可以自己做!

尽管如此,我仍强烈推荐第一种解决方案。摆脱长期存在的Session对象。