【问题标题】:c3p0: detecting db down / up eventsc3p0:检测 db down/up 事件
【发布时间】:2016-02-04 14:55:06
【问题描述】:

在重新发明了几次实现自己的数据库连接池的轮子之后,我终于决定尝试 c3p0。阅读文档后,它似乎很容易使用和配置。

我在文档中找不到的一件事是如何通过侦听器或其他机制检测数据库何时关闭或使用 c3p0 启动。在我们的应用程序中,我需要告诉客户端数据库已关闭,因此它无法发送某些需要在数据库中记录的订单。我想知道是否有使用 c3p0 检测这些更改的标准方法,或者我必须自己实现一个外部线程,通过执行简单的 select 语句定期查询数据库。

我觉得这个功能在连接池中是必须的,而且必须有办法使用 c3p0 来实现,但我就是找不到。如果这不存在,我想再次重新发明轮子。

【问题讨论】:

  • 你也应该试试Hikari
  • 它没有 javadoc 或 API 文档,或者至少我找不到它。在我看来这并不严重。
  • 它是一个 Maven 项目。它将在构建时创建文档...

标签: java mysql c3p0


【解决方案1】:

在对它们执行某些操作之前,连接池无法知道数据库的状态,甚至它的连接是什么。至少可以将一些连接池配置为在特定时间后重新创建连接,因此连接池会在此时注意到有问题。还有其他机制,例如在发出连接之前执行的测试查询,以验证连接是否有效。

如果您想跟踪状态,您别无选择,只能自己轮询 DB。

【讨论】:

  • 嗯...这将是一个不错的功能。一个侦听器,指示您 db 是向上还是向下。如果数据库已关闭,IMO,最好将数据库请求排队并在您知道数据库已启动时执行它们,而不是尝试执行它们以捕获异常并一次又一次地重试执行。
  • 这就是监控系统的用途。他们轮询不同的服务器以查看它们是否正常运行。一旦数据库再次启动,排队请求并执行它们也绝对不是一个好主意。虽然这可能适用于非常简单的情况,但它会在现实世界的情况下搞乱事务并损坏数据。
  • 我从设备收到一些数据测量,它们必须全部存储在历史数据库中。如果应用程序已收到,则不会丢失任何度量。做到这一点的唯一方法是在数据库关闭时对插入进行排队,并在数据库再次启动时执行它们。如果您能想到更好的方法,请告诉我。
  • 我只是说它适用于简单的情况,比如你的情况。它不适用于高度并发的多事务情况。因此,这不是一个通用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2023-02-25
  • 2012-06-13
相关资源
最近更新 更多