重试数据库连接Dropwizard

时间:2020-11-04 17:18:16

标签: java jdbc dropwizard jdbi

如果连接第一次不起作用,如何重试连接到数据库? 我正在使用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)抛出了SQLException,但从未捕获到异常。

1 个答案:

答案 0 :(得分:0)

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

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

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

此外,Application的run()方法可能正在捕获所有异常,并将其记录下来,这意味着您试图捕获它们将无济于事。在这种情况下,您必须编辑run()的代码。