Ну, не ответ, но некоторые напоминания, которым нужно место:
1) Вы используете ArrayList, начиная с нулевой емкости ... он должен часто менять размер своего буфера, потому что размер массива увеличивается следующим образом: 0 -> 1 -> 2 -> 4 -> 7 -> 11 -> 17
.
Поэтому вместо List<String> valueList = new ArrayList<String>(0);
используйте List<String> headerList = new ArrayList<String>(columnCount);
Вместо valueList = new ArrayList<String>(0);
используйте valueList.clear();
2) Вы должны использовать resource-try-catch, намного проще в обращении.
3) Код - или, скорее: за кулисами - много разбирается ... разбирает результат SQL, затем "разбирает" данные (должен быть экранирован CSV-совместимым способом). Не стоит недооценивать это! Более того, если этот CSVPrinter выполняет дополнительное форматирование, например дополнительный интервал для сохранения текстового файла в виде таблицы и т. Д.
4) Кроме того, библиотеки Apache не известны ни своей скоростью, ни своей эффективностью использования ресурсов!
5) Ручная очистка (как читается в комментариях) не подходит для производительности!
6) Как это выглядит, ваш метод writeResultSetToFile()
вызывается из цикла. Я не знаю, но если вы скажете нам о «3% использования», это звучит как устойчивая задача, то есть цикл. Итак, ПОДДЕРЖИВАЯ есть цикл, и этот цикл непосредственно отвечает за 3% использования ЦП, кажется, что он повторяется несколько тысяч раз в секунду.
Если вы теперь - при каждом вызове - извлекаете и сохраняете ДВА МИЛЛИОНА строк текста, это замедлит всю программу. ЗНАЧИТЕЛЬНО.
Может быть, вы не должны писать этот файл так часто? Может быть, достаточно одной минуты? Однако часто вы можете подумать об использовании развязанного потока, который выполняется параллельно основному циклу.