【问题标题】:Vertx connection timeout not catched JDBCClient (.getConnection)Vertx 连接超时未捕获 JDBCClient (.getConnection)
【发布时间】:2018-04-26 02:54:37
【问题描述】:

我无法处理在 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

有人可以帮帮我。

谢谢。

【问题讨论】:

  • 我猜最近的vertx版本已经解决了这个问题?因为我无法重现它。

标签: java vert.x


【解决方案1】:

你可以尝试做这样的事情:

  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;
  }

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

【讨论】:

  • 也是一样,问题是client.getConnection永远不会返回未来的结果,所以当你这样做时 if (it.succeeded()) { future.complete(it.result()); } 其他 { future.fail(it.cause());永远不要执行 future.complete(it.result());或future.fail(it.cause());
  • 我得到了,看来问题是jdbc配置错误,或者你的数据库被关闭了。您能否提供有关数据库的更多详细信息?
  • 是的,当数据库关闭时我有这个问题,所以如果我在未来的结果中设置一个计时器,它就不会执行
  • 我不确定我对您的理解是否正确,如果您的数据库关闭,您总是会收到错误消息。什么问题?检查您的数据库
  • 问题是当数据库关闭时,我在 client.getConnection 的未来没有发现这个
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 2015-04-19
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多