Мне нужна помощь в устранении неисправностей одного из моих сервисов vertx.У меня есть вертикал базы данных, который использует JDBCClient.До недавнего времени мой код работал нормально, и теперь он начал давать исключение тайм-аута.Клиент db тратит слишком много времени, чтобы вернуть результаты, и к тому времени, когда он возвращает результаты, httpverticle истекает.
Когда я запрашиваю базу данных вне vertx, она возвращает результат в течение 10 миллисекунд, поэтому я считаю, что база данных работает нормально.Сбой не сразу после перезагрузки.Так что, похоже, не из-за перегрузки.
Мой код:
public class TestDbVerticle extends AbstractVerticle {
private static final Logger logger = LoggerFactory.getLogger("TestDbVerticle");
private JDBCClient dbClient;
@Override
public void start(Future < Void > startFuture) throws Exception {
logger.trace("start - Starting TestDbVerticle...");
JsonObject config = new JsonObject();
config.put("url", config().getString("url"));
config.put("driver_class", config().getString("driver_class"));
config.put("max_pool_size", config().getInteger("max_pool_size"));
config.put("min_pool_size", config().getInteger("min_pool_size"));
config.put("max_statements", config().getInteger("max_statements"));
dbClient = JDBCClient.createShared(vertx, config, "jdbc/test");
dbClient.getConnection(ar - > {
if (ar.failed()) {
logger.error("start- Could not open a database connection", ar.cause());
startFuture.fail(ar.cause());
} else {
logger.trace("start- DB Vertcle connected to db successfully.");
vertx.eventBus().consumer(config().getString("test.queue.address"), this::onMessage);
startFuture.complete();
}
});
}
public void onMessage(Message < JsonObject > message) {
if (!message.headers().contains("action")) {
logger.error("No action header specified for message with headers {} and body {}", message.headers(),
message.body().encodePrettily());
message.fail(100, "No action header specified");
return;
}
String action = message.headers().get("action");
switch (action) {
case "find_by_id":
findById(message);
break;
default:
message.fail(101, "Bad action: " + action);
}
}
private void findById(Message < JsonObject > message) {
try {
JsonObject request = message.body();
Long id = Long.parseLong(request.getString("id").trim());
JsonArray params = new JsonArray().add(id);
final long time = System.currentTimeMillis();
String query = "SELECT * from test WHERE test_id =? ORDER BY created_date DESC;";
logger.debug("findById - params [" + params + "}. query [" + query + "]");
dbClient.queryWithParams(query, params, result - > {
long currentTime = System.currentTimeMillis();
long totalTime = currentTime - time;
logger.debug("findById - Total time taken to execute query [" + totalTime + "]");
if (result.succeeded()) {
logger.debug("findById - Query exection successed with numrows [" + result.result().getNumRows() + "]");
if (result.result().getNumRows() > 0) {
message.reply(result.result().getRows().get(0).toString());
} else {
message.reply(result.result().getRows().toString());
}
} else {
logger.error("findById - Failed getting data", result.cause());
JsonObject out = new JsonObject();
out.put("error_code", 10);
out.put("status", "Fail");
message.reply(out);
}
});
} catch (Exception e) {
logger.error("findById - Failed getting data by id failed", e);
JsonObject out = new JsonObject();
out.put("error_code", 20);
out.put("status", "GenericException");
message.reply(out);
}
}
}
Метод запуска выполняется без проблем.Журнал выводит «start-DB Vertcle успешно подключен к БД».Вызовы из http verticle доходит до метода onMessage и findById.Запрос на печать строки № 74, а затем ошибки http ver vert, ожидающие 30000 миллисекунд.Время, необходимое для выполнения метода dbClient.queryWithParams, составило более минуты.До недавнего времени это работало нормально.
Я изменил пул соединений на HikariCP, и он не сделал различий.
Может кто-нибудь помочь решить проблему?