user3159152
user3159152

Reputation: 611

vert.x async jdbc doesn't close connections

I'm implementing a RESTful API with Vert.x. I used its async jdbc client with MySQL and c3p0 as connection pool.

My problem is that although the closeConnection handler is successful, the actual database connection is not closed and reused. The pool gets full in seconds, resulting in: BasicResourcePool:204 - acquire test -- pool is already maxed out. [managed: 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!");
        }
    });
});

});

Any idea what I'm missing?

All the best!

Upvotes: 1

Views: 1574

Answers (1)

Paulo Lopes
Paulo Lopes

Reputation: 5801

You're probably facing some exception in your handler, if such thing happens, then the last line will not be executed, therefore the close is not called and the connection returned to the pool.

You should wrap your code with a try finally block to guarantee the connection is returned to the pool.

Upvotes: 2

Related Questions