首页 > 解决方案 > 重试数据库连接 Dropwizard

问题描述

如果连接第一次不起作用,我如何重试连接到我的数据库?我正在使用 jdbi3 进行数据库连接

  public static void main(String[] args) throws Exception {
    startApp(args);
  }

  private static void startApp(String[] args) throws Exception {
    try {
      new Application().run(args);
    } catch(SQLException ex) {
      System.out.println("Could not connect to database.");
      System.out.println("Try reconnecting...");
      TimeUnit.SECONDS.sleep(2);
      startApp(args);
    }
  }

我实现了这一点,因为new Application().run(args)它抛出了SQLExceptionif there is no connection 但从未捕获到异常。

标签: javajdbcdropwizardjdbi

解决方案


这最终会导致堆栈溢出。更好的:

while (true) {
    try (
        new Application().run(args);
        return;
    } catch (SQLException e) {
        continue;
    }
}

但这还不是全部:这将重试任何SQL 异常。因此,如果说数据库已启动,但应用程序所做的第一件事是创建一个表,但该表已经存在,这将永远以 2 秒的间隔重新尝试和失败,这很糟糕。我建议检查如果数据库已关闭(大概这就是您要重试的原因:等待数据库返回)并只捕获那个 -actual- SQLException抛出。请注意,SQLException 具有比大多数异常类型更多的方法,例如 .getSQLState(),您应该检查它以确定错误是否实际上是“无法连接到数据库引擎”,而不是其他一些问题。

此外,Application 的 run() 方法很可能正在捕获所有异常,并将记录它们,这意味着您尝试捕获它们不会做任何事情。在这种情况下,您必须编辑 run() 的代码。


推荐阅读