简短的回答是否定的,c3p0 在这里帮不了你。
听起来(看这里和你之前的问题)你正在做一些与 c3p0 交叉目的的事情,也就是说你正在持有长期存在的会话,而不是根据需要创建会话然后立即销毁它们。那种东西是很脆弱的。这是为了避免存在连接池的架构。
IMO,您最好的选择是“不要那样做”。永远不要缓存会话。然后普通的连接测试(可能也设置了 checkoutTimeout)将解决问题。如果分片关闭,尝试获取连接将失败,如果这是最好的解决方法,您可以跳过分片。
c3p0 对休眠一无所知。c3p0 的作者感谢 hibernate 普及了他的(我的)库,但是 c3p0 不知道 Session 是什么,只是一个 Connection。理论上,c3p0 可以帮助您的唯一方法是,它可以在发现数据库已关闭时向您报告一个事件(根据您的配置,这可能会非常迅速或非常缓慢)。您可以通过 close()ing 会话来响应事件。
不幸的是,c3p0(还)没有提供用户可以用来响应采集失败的钩子。可能——这是我正在考虑为 0.9.6 添加的功能。但现在没有。但是,实现一些可以轮询您的分片并自己关闭它们的会话的东西将是非常微不足道的。所有 c3p0 要注意中断都会调用 DriverManager.getConnection( ... ) 或 dataSource.getConnection() 并观察异常。你可以自己做!
不过,我仍然强烈推荐第一个解决方案。摆脱长期存在的 Session 对象。