Только установка размера выборки не является правильным подходом. Javadoc Statement#setFetchSize()
уже заявляет следующее:
Предоставляет драйверу JDBC подсказку относительно количества строк, которые следует извлечь из базы данных
Водитель может свободно применять или игнорировать подсказку. Некоторые драйверы игнорируют его, некоторые драйверы применяют его напрямую, некоторым драйверам нужно больше параметров. Драйвер MySQL JDBC относится к последней категории. Если вы посмотрите документацию по драйверу MySQL JDBC , вы увидите следующую информацию (прокрутите примерно на 2/3 до заголовка ResultSet ):
Чтобы включить эту функцию, вам нужно создать экземпляр Statement следующим образом:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Пожалуйста, прочитайте весь раздел документа, он также описывает предостережения этого подхода. Вот соответствующий цитата:
Есть несколько предостережений при таком подходе. Вам нужно будет прочитать все строки в наборе результатов (или закрыть его), прежде чем вы сможете выполнить какие-либо другие запросы для соединения, иначе возникнет исключение.
(...)
Если оператор находится в рамках транзакции, блокировки снимаются по завершении транзакции (что подразумевает, что сначала необходимо выполнить инструкцию). Как и в большинстве других баз данных, операторы не завершены до тех пор, пока не будут прочитаны все результаты, ожидающие этого оператора, или пока не будет закрыт активный набор результатов для оператора.
Если это не исправляет OutOfMemoryError
(не Exception
), то, скорее всего, проблема в том, что вы сохраняете все данные в памяти Java, а не обрабатываете их немедленно , как только данные поступают. Для этого потребуется больше изменений в вашем коде, возможно, полное переписывание. Я отвечал на аналогичный вопрос раньше здесь .