java - 重试数据库连接 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)
它抛出了SQLException
if there is no connection 但从未捕获到异常。
解决方案
这最终会导致堆栈溢出。更好的:
while (true) {
try (
new Application().run(args);
return;
} catch (SQLException e) {
continue;
}
}
但这还不是全部:这将重试任何SQL 异常。因此,如果说数据库已启动,但应用程序所做的第一件事是创建一个表,但该表已经存在,这将永远以 2 秒的间隔重新尝试和失败,这很糟糕。我建议检查如果数据库已关闭(大概这就是您要重试的原因:等待数据库返回)并只捕获那个 -actual- SQLException抛出。请注意,SQLException 具有比大多数异常类型更多的方法,例如 .getSQLState(),您应该检查它以确定错误是否实际上是“无法连接到数据库引擎”,而不是其他一些问题。
此外,Application 的 run() 方法很可能正在捕获所有异常,并将记录它们,这意味着您尝试捕获它们不会做任何事情。在这种情况下,您必须编辑 run() 的代码。
推荐阅读
- ssl - 使用 Lettuce 驱动程序和 TLS SNI 连接到 Redis 主机
- vba - 如果单价格式设置为货币,则计算文本框不会计算
- scrapy - 为什么 xpath text() 节点不能嵌套在 Scrapy 中
- php - Wordpress:推进自定义字段多选
- python - 如何使用 tensorflow 的 tf.data.Dataset API 预处理数据?
- php - 在页面上显示来自数据库的照片的问题
- javascript - ReactDOM.render 渲染页面
- web-scraping - 为什么 YouTube 在浏览器中返回的结果与原始 HTTP 请求不同?
- c++ - C++20:多种类型的概念及其约束,正确的语法?
- x86 - intel i7-8705G使用什么指令集?