Java 检查数据库连接是否处于活动状态

Java 检查数据库连接是否处于活动状态,java,postgresql,jdbc,Java,Postgresql,Jdbc,我正在编写股票报价处理引擎,并使用pgjdbc-ng-0.6库从postgresql数据库接收异步通知。我想知道我的数据库连接是否仍然存在,所以我在线程的run()方法中编写了 while (this.running) { try { this.running = pgConnection.isValid(Database.CONNECTION_TIMEOUT); Thread.sleep(10000); }

我正在编写股票报价处理引擎,并使用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()
,但没有成功。

企业开发人员解决此问题的可能方法之一是使用现有线程池创建单独的线程,以便在 可使用test
call()
调用DB(对于Oracle,它可能是
“从dual中选择“OK”
), 使用语句
object.execute(“…”)
,(而不是
executeUpdate
,因为它 可能导致呼叫被卡住),并进一步使用,例如-
future.get(3,TimeUnit.Seconds)

在最后一次调用中使用此方法,您需要捕获
InterruptedException
对于
get()
调用。如果Callable抛出,则将数据库可用性设置为false,否则设置为true


在企业应用程序中使用此方法之前,您必须确保您有权访问特定对象中的application server threadPool executor并在其中@Autowire。企业开发人员解决此问题的可能方法之一是使用现有threadPool创建单独的线程,以便在中提交 可使用test
call()
调用DB(对于Oracle,它可能是
“从dual中选择“OK”
), 使用语句
object.execute(“…”)
,(而不是
executeUpdate
,因为它 可能导致呼叫被卡住),并进一步使用,例如-
future.get(3,TimeUnit.Seconds)

在最后一次调用中使用此方法,您需要捕获
InterruptedException
对于
get()
调用。如果Callable抛出,则将数据库可用性设置为false,否则设置为true


在企业应用程序中使用此方法之前,您必须确保您有权访问特定对象中的application server threadPool executor并@Autowire它。

您可以尝试执行一些查询,检查它是否正常返回或是否引发了一些异常。该方法不会给我可预测的查询量检测到时间问题。可能,解决方案是使用并发包中的执行器,并在需要超时的情况下查询Future。不过看起来像是重新发明轮子。你可以尝试执行一些查询,检查它是否正常返回或是否引发了一些异常。该方法不会给我检测到问题的可预测时间。可能,解决方案是使用并发包中的执行器,并在需要超时的情况下查询Future。看起来像是在重新发明轮子。来自dual的
在Postgres中将无效(除非您创建一个名为
dual
的表)。来自dual的
在Postgres中将无效(除非您创建一个名为
dual
的表)