配置c3p0以在连接断开时关闭Hibernate会话

时间:2013-10-29 17:13:14

标签: java hibernate session c3p0

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

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

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

1 个答案:

答案 0 :(得分:3)

简短的回答是否定的,c3p0在这里不会帮到你。

这听起来像(看这里和你之前的问题)你正在做一些与c3p0交叉工作的东西,也就是你持有长寿的Sessions而不是根据需要创建Sessions然后摧毁他们及时。那种东西很脆弱。它是存在连接池以避免的。

你最好的选择,IMO,将“不要那样做”。永远不要缓存Sessions。然后普通的连接测试(也许设置了checkoutTimeout)将解决问题。如果分片已关闭,尝试获取连接将失败,如果这是最好的解决方法,您可以跳过分片。

c3p0对hibernate一无所知。 c3p0的作者非常感谢hibernate推广他的(我的)库,但c3p0不知道Session是什么,只是一个Connection。理论上,c3p0可以帮助你的唯一方法就是当它注意到数据库关闭时(根据你的配置可能非常迅速或非常慢),它可以向你报告一个事件。你可以通过close()会话回应这个事件。

不幸的是,c3p0还没有提供用户可以响应采集失败的钩子。它可能 - 这是我正在考虑添加0.9.6的功能。但现在不行。但是,实现一些轮询你的分片并自己关闭Sessions的东西将是非常简单的。所有c3p0都会注意到中断是调用DriverManager.getConnection(...)或dataSource.getConnection()并观察异常。你可以自己做!

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