Недостаточно памяти allocLargeObjectOrArray из ResultSet
Я использую JDBC для получения большого количества данных. Вызов завершается успешно, но когда resultSet.next()
называется, я получаю следующую ошибку:
java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998
Я пытался увеличить объем памяти JVM, но это не решает проблему. Я не уверен, что эту проблему можно решить, поскольку я не использую JDBC для доступа к базе данных, скорее, система обращается к сервису BEA AquaLogic через JDBC.
Кто-нибудь сталкивался с этой ошибкой?
5 ответов
Помните, что до первого вызова метода resultSet.next() результаты еще не могут быть считаны из базы данных или по-прежнему находиться в другой структуре кэширования.
Вы должны попытаться ограничить свой выбор, чтобы вернуть нормальное количество результатов и, возможно, повторять вызов, пока не останется больше результатов, если вам нужны все данные.
Увеличение объема памяти JVM не поможет, если вы не уверены, что существует абсолютное ограничение на объем данных, которые будут возвращены вашим вызовом JDBC.
Более того, доступ к любому сервису через JDBC сводится к использованию JDBC:)
Другая (маловероятная) возможность может заключаться в том, что в используемом вами драйвере JDBC есть ошибка. Попробуйте другую реализацию, если это возможно, и проверьте, сохраняется ли проблема.
Во-первых, выясните, действительно ли вам нужно получить столько данных одновременно. СУБД хороши для агрегирования / сортировки / и т.д. больших наборов данных, и вы должны попытаться воспользоваться этим, если это возможно.
Если нет (а вам действительно, действительно нужно так много данных в рабочей памяти по какой-то причине)... и увеличение аргументов памяти JVM не поднимает планку достаточно... посмотрите на решение распределенного кэширования в памяти, как Coherence (COTS) или TerraCotta (с открытым исходным кодом).
Вы можете попробовать установить метод setFetchSize(int row) в своем выражении.
Но setFetchRows - это только подсказка, что означает, что он не может быть реализован.
Сколько строк вы возвращаете из базы данных? как и kosi2801, я бы предложил выбрать только подмножество данных, начать с разумного числа, а затем увеличить, чтобы найти порог.
Попробуйте увеличить объем памяти до 1,2 г, например, -mx1200 м или чуть меньше физической памяти вашей машины. Вы можете обнаружить, что он читает больше данных, чем вы думаете.