Вы можете использовать PreparedStatement и параметры, которые могут избежать перекомпиляции запроса. Поскольку performanceTable
является константой, это можно вставить в подготовленный запрос. Остальные переменные, используемые в условии WHERE, задаются как параметры.
Вне цикла создайте подготовленный оператор, а не обычный оператор:
PreparedStatement stmtD = conn.prepareStatement(
"Select d.dtime,d.ifInOctets, d.ifOutOctets from "+performanceTable+"_1_60 AS d"+
" Where d.id = ? AND dtime BETWEEN ? AND ?");
Затем, в вашем цикле, установите параметры:
stmtD.setInteger(1, interfaceID);
stmtD.setInteger(2, startTime);
stmtD.setInteger(3, endTime);
ResultSet rsD = stmtD.executeQuery(); // note no SQL passed in here
Может быть хорошей идеей также проверить план запроса из MySQL с помощью EXPLAIN
, чтобы увидеть, является ли это также узким местом. Кроме того, в функции происходит довольно много конкатенации диагностических строк. Как только запрос заработает, удаление может также повысить производительность.
Наконец, обратите внимание, что даже если запрос быстрый, сетевая задержка может замедлить работу. JDBC обеспечивает пакетное выполнение нескольких запросов, чтобы помочь уменьшить общую задержку на оператор. См. AddBatch / executeBatch для подключения.