Недостаточно памяти при выполнении большого запроса?

Я получил эту ошибку при попытке сделать большой запрос.

java.lang.OutOfMemoryError: Java heap space

Я искал и обнаружил, что применение методов setAutoCommit(false) и setFetchSize к моему подготовленному выражению может помочь в обработке большого запроса. Однако, когда я использовал это, я получил эту ошибку.

java.sql.SQLException: Illegal value for setFetchDirection().

Как правильно и просто обрабатывать большие запросы?

Как правильно использовать setFetchSize?

2 ответа

Предполагая, что вы используете Connector/J драйвер, предоставляемый MySQL, я считаю, что решение найдено на этой странице руководства (обратите внимание на параметр 1 из Connection::createStatement()):

Если вы работаете с ResultSets, которые имеют большое количество строк или больших значений и не могут выделить пространство кучи в вашей JVM для требуемой памяти, вы можете указать драйверу потоковую передачу результатов назад по одной строке за раз.

Чтобы включить эту функцию, создайте экземпляр Statement следующим образом:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Может быть, ленивый поиск, например, просто идентификаторы или что-то еще, когда вы хотите использовать / отображать ваши данные из запроса только по этому идентификатору?

или, может быть, вместо этого запустить его в потоке, чтобы он просто ушел и делает это в фоновом режиме

Другие вопросы по тегам