Недостаточно памяти при выполнении большого запроса?
Я получил эту ошибку при попытке сделать большой запрос.
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);
Может быть, ленивый поиск, например, просто идентификаторы или что-то еще, когда вы хотите использовать / отображать ваши данные из запроса только по этому идентификатору?
или, может быть, вместо этого запустить его в потоке, чтобы он просто ушел и делает это в фоновом режиме