2016-05-28 80 views
0

我正在使用Vert.x实现RESTful API。我用它的MySQL和c3p0作为连接池的异步jdbc客户端。vert.x异步jdbc未关闭连接

我的问题是,虽然closeConnection处理程序成功,但实际的数据库连接没有关闭并重用。池会在几秒钟内完成,导致:BasicResourcePool:204 - 获取测试池已经超时。 [托管:20; max:20]

client.getConnection(connectionAsyncResult -> { 
SQLConnection connection = connectionAsyncResult.result(); 
connection.queryWithParams("SELECT * FROM AIRPORTS WHERE ID = ?", new JsonArray().add(id), select -> { 
    ResultSet resultSet = select.result(); 
    Airport $airport = resultSet.getRows() 
      .stream() 
      .map(Airport::new) 
      .findFirst() 
      .get(); 

    asyncResultHandler.handle(Future.succeededFuture($airport)); 
    connection.close(closeHandler -> { 
     if (closeHandler.succeeded()) { 
      LOG.debug("Database Connection closed"); 
     } 
     else if (closeHandler.failed()) { 
      LOG.error("Database Connection failed to close!"); 
     } 
    }); 
}); 

});

任何想法我失踪?

一切顺利!

回答

2

您可能会在处理程序中遇到一些异常,如果发生这种情况,则最后一行将不会执行,因此不会调用关闭并将连接返回到池中。

您应该用tryfinally块封装代码以确保连接返回到池。

+0

非常好的主意Paulo,但事实并非如此。我更新了代码(参见上文)。它总是说收盘成功。试图结束它的尝试 - 最后,相同的结果:误报。 – user3159152

+0

在这种情况下,我会建议在vertx-jdbc-client上打开一个问题,并添加一个简单的复制器示例,以便对其进行调查。 –