gpt4 book ai didi

java - 配置 c3p0 以在连接断开时关闭 Hibernate session

转载 作者:行者123 更新时间:2023-11-30 08:29:07 25 4
gpt4 key购买 nike

我将 Hibernatec3p0 一起用于连接池。由于我在多分片数据库环境中工作,分片停机的可能性是一个现实的用例场景(通过手头应用程序的外部方式,例如有人出于某种原因只是将分片关闭),我试图让 c3p0一旦 Hibernate session 检测到数据库连接断开,就明确关闭它,这样我就可以在我的多分片扫描中跳过特定分片的 session 。

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

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

最佳答案

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

听起来(看这里和你之前的问题)你正在做一些与 c3p0 交叉目的的事情,也就是说你持有长生命周期的 session 而不是根据需要创建 session 然后销毁他们迅速。那种东西是很脆弱的。连接池的存在是为了避免这种架构。

在我看来,您最好的选择是“不要那样做”。根本不要缓存 session 。然后普通的连接测试(也许也设置了 checkoutTimeout)将解决问题。如果分片出现故障,尝试获取连接将失败,如果这是最好的解决方法,您可以跳过该分片。

c3p0 对 hibernate 一无所知。 c3p0的作者感谢hibernate普及了他的(我的)库,但是c3p0不知道什么是Session,只是一个Connection。从理论上讲,c3p0 可以为您提供一点帮助的唯一方法是,当它注意到数据库已关闭时,它可以向您报告一个事件(根据您的配置,这可能会非常迅速或非常缓慢)。您可以通过 close()ing session 来响应事件。

不幸的是,c3p0(还)没有提供用户可以用来响应获取失败的 Hook 。它可能 — 这是我正在考虑为 0.9.6 添加的功能。但现在没有。然而,实现轮询您的分片并自行关闭它们的 session 的东西将是非常微不足道的。所有 c3p0 会做的注意到中断将是调用 DriverManager.getConnection( ... ) 或 dataSource.getConnection() 并观察异常。你可以自己做!

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

关于java - 配置 c3p0 以在连接断开时关闭 Hibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com