【发布时间】:2017-01-13 13:43:26
【问题描述】:
我正在编写股票报价处理引擎,并使用 pgjdbc-ng-0.6 库从 postgresql 数据库接收异步通知。我想知道我的数据库连接是否还活着,所以我写在线程的run()方法中
while (this.running) {
try {
this.running = pgConnection.isValid(Database.CONNECTION_TIMEOUT);
Thread.sleep(10000);
} catch (SQLException e) {
log.warn(e.getMessage(), e);
gracefullShutdown();
} catch (InterruptedException e) {
gracefullShutdown();
}
}
我阅读了isValid() 声明,它声明如果超时,该函数将返回false。但是,isValid() 只是无限期挂起,run() 永远不会退出。为了产生连接问题,我禁用了我的应用程序用来连接数据库的 VPN。相当粗鲁的方式,但函数必须返回false......驱动程序中的这个错误或其他方法是否存在?
我在PGDataSource 中尝试了setNetworkTimeout(),但没有任何成功。
【问题讨论】:
-
你可以尝试执行一些查询,检查它是否正常返回或是否抛出异常。
-
该方法无法给我可预测的时间量来检测问题。可能,解决方案是使用并发包中的 Executors 并使用所需的超时查询 Future。不过看起来像是在重新发明轮子。
标签: java postgresql jdbc