Недостаточно памяти allocLargeObjectOrArray из ResultSet - PullRequest
1 голос
/ 02 июня 2009

Я использую JDBC для получения большого количества данных. Вызов завершается успешно, но когда вызывается resultSet.next(), я получаю следующую ошибку:

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998

Я пытался увеличить объем памяти JVM, но это не решает проблему. Я не уверен, что эту проблему можно решить, поскольку я не использую JDBC для доступа к базе данных, скорее система получает доступ к службе BEA AquaLogic через JDBC.

Кто-нибудь сталкивался с этой ошибкой?

Ответы [ 5 ]

1 голос
/ 04 ноября 2009

Во-первых, выясните, действительно ли вам нужно получить столько данных одновременно. СУБД хороши для агрегирования / сортировки / и т.д. больших наборов данных, и вы должны попытаться воспользоваться этим, если это возможно.

Если нет (а вам действительно, по какой-то причине вам действительно нужно столько данных в рабочей памяти) ... и увеличение аргументов памяти JVM не поднимает планку достаточно ... посмотрите на распределение в памяти решение для кэширования, например Coherence (COTS) или TerraCotta (с открытым исходным кодом).

1 голос
/ 02 июня 2009

Помните, что до первого вызова метода resultSet.next () результаты еще не могут быть считаны из базы данных или по-прежнему находиться в другой структуре кэширования.

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

Увеличение объема памяти JVM не поможет, если вы не уверены, что существует абсолютное ограничение на объем данных, которые будут возвращены вашим вызовом JDBC.

Более того, доступ к любому сервису через JDBC сводится к использованию JDBC:)

Другая (маловероятная) возможность может заключаться в том, что в используемом вами драйвере JDBC есть ошибка. Попробуйте другую реализацию, если это возможно, и проверьте, сохраняется ли проблема.

0 голосов
/ 06 ноября 2009

Сколько строк вы возвращаете из базы данных? как и kosi2801, я бы предложил выбрать только подмножество данных, начать с разумного числа, а затем увеличить, чтобы найти порог.

0 голосов
/ 17 июня 2009

Попробуйте увеличить объем памяти до 1,2 г, например -mx1200m или что-то чуть меньше, чем физическая память вашей машины. Вы можете обнаружить, что он читает больше данных, чем вы думаете.

0 голосов
/ 17 июня 2009

Вы можете попробовать установить метод setFetchSize (int row) в своем выражении.
Но setFetchRows является лишь подсказкой, что означает, что он может быть не реализован.

...