Судя по комментариям, вы, кажется, создаете Statement
и ResultSet
внутри цикла, но никогда не закрываете их. Вы должны также закрыть их в цикле. Это освободит внутренние ресурсы.
Кроме того, вы не пользуетесь кешем БД подготовленного оператора. Прямо сейчас вы объединяете строку параметра в строке SQL, в результате чего создаются объекты 2M String вместо 1 объекта String. Лучше подготовьте выписку перед циклом.
try {
// ...
statement = connection.prepareStatement("select NAME from TABLE_NAME where FIELD=?");
for ( /* 2M times? */ ) {
statement.setInt(1, id);
try {
resultSet = statement.executeQuery();
// ...
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
}
}
} finally {
if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
}
В качестве альтернативы, вы также можете использовать предложение IN
. Э.Г.
WHERE field IN (1,2,3,4,5);
Это, однако, сложнее с заполнителями. См. Также: Каков наилучший подход с использованием JDBC для параметризации предложения IN?
Или в качестве совершенно другой альтернативы, если необходимо, с помощью более опытного администратора БД / ниндзя SQL, переписать все это так, чтобы вы получили точно результаты, которые вам нужны, только с один SQL-запрос. Задайте, если необходимо, отдельный вопрос об этом на sql здесь на SO.