我正在编写股票报价处理引擎并使用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 ...驱动程序或其他方法中的这个错误是否存在?
我在setNetworkTimeout()
中尝试PGDataSource
,但没有成功。
答案 0 :(得分:0)
Enterprise 开发者对这个问题可能的处理方式之一是使用现有的 threadPool 创建一个单独的线程来提交
可通过数据库的测试 call()
调用(在 Oracle 的情况下,它可能是 "SELECT 'OK' FROM dual"
),
using 语句 object.execute('...')
, (不是 executeUpdate
,因为它
可能会导致调用卡住),并进一步使用例如 - future.get(3, TimeUnit.Seconds)
。
在最终调用中使用此方法需要捕获 InterruptedException
get()
通话。如果 Callable 抛出您将数据库可用性设置为 false,否则为 true。
在企业应用程序中使用这种方法之前,您必须确保您可以访问特定对象中的应用程序服务器线程池执行程序,并在那里@Autowire。