2016-05-28 120 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上打開一個問題,並添加一個簡單的複製器示例,以便對其進行調查。 –