Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未捕获Vertx连接超时JDBCClient(.getConnection)_Java_Vert.x - Fatal编程技术网

Java 未捕获Vertx连接超时JDBCClient(.getConnection)

Java 未捕获Vertx连接超时JDBCClient(.getConnection),java,vert.x,Java,Vert.x,我无法处理JDBCClient中连接失败的情况,例如:没有要路由的主机、连接超时等。因为方法.getConnection()不是返回failedFuture,但它在监视器中显示原因,然后它将静音。 我认为当连接超时或其他原因时,它应该发送失败的未来,而不是打印错误日志 我的示例代码是 JDBCClient client = ...; client.getConnection(conn -> { if (conn.succeeded()) { .... } e

我无法处理JDBCClient中连接失败的情况,例如:没有要路由的主机、连接超时等。因为方法.getConnection()不是返回failedFuture,但它在监视器中显示原因,然后它将静音。 我认为当连接超时或其他原因时,它应该发送失败的未来,而不是打印错误日志

我的示例代码是

JDBCClient client = ...;
client.getConnection(conn -> {
    if (conn.succeeded()) {
        ....
    } else {
        // This is never executed (connection time out and etc.)
        handler.handle(Future.failedFuture(conn.cause()));
    }
});
我在日志中发现此错误:

An attempt by a client to checkout a Connection has timed out.
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118) 
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) 
    at JDBCClient.lambda$getConnection$1(JDBCClient.java:132) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:1.8.0_144]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:1.8.0_144]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_144]
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@16404129 -- timeout at awaitAvailable()
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685) 
    ... 5 more
有人能帮我吗


谢谢。

您可以尝试制作以下内容:

  public Future<SQLConnection> tryConnect() {
    JDBCClient client = JDBCClient.createNonShared(vertx, config());
    Future<SQLConnection> future = Future.future();
    client.getConnection(it -> {
      if (it.succeeded()) {
        future.complete(it.result());
      } else {
        future.fail(it.cause());
      }
    });
    return future;
  }
public Future tryConnect(){
JDBCClient=JDBCClient.createNonShared(vertx,config());
Future=Future.Future();
client.getConnection(it->{
if(it.successed()){
future.complete(it.result());
}否则{
future.fail(it.cause());
}
});
回归未来;
}

只需手动创建future,然后在回调中解析或拒绝它。这实际上是这种情况下的常见方法。

这是一样的,问题是client.getConnection永远不会返回将来的结果,所以当你这样做时,如果(It.succeed()){future.complete(It.result());}else{future.fail(It.cause());}那么永远不要执行future.complete(It.result());或者未来。失败(it.cause());我明白了,问题似乎是jdbc配置错误,或者数据库关闭了。你能提供更多关于数据库的详细信息吗?是的,当数据库关闭时,我有这个问题,因此如果我在将来的结果中设置了一个计时器,那么它将不会执行。我不确定我是否正确理解你,如果数据库关闭,你将始终得到一个错误。什么问题?检查您的数据库问题是,当数据库关闭时,我在client.getConnection的未来不会发现这一点