У нас есть веб-приложение Java, использующее Data Nucleus 1.1.4/JDO 2.3 для сохранения.
Существует операция пакетного импорта, которая сохраняет большое количество объектов JDO в один выстрел. У нас были ситуации, когда выдавались ошибки OutOfMemoryError, поскольку данные для импорта были очень большими.
Планируемый шаблон заключался в том, чтобы пройти через входной поток, проанализировать строку, создать экземпляр объекта JDO, вызвать makePersistent, а затем освободить ссылку на объект на объект JDO, чтобы сохраняйте объем памяти неизменным независимо от размера входных данных.
При выполнении некоторого анализа кучи во время этой операции выяснилось, что экземпляры объектов JDO накапливаются и занимают большой кусок памяти до момента фиксации случается. Несмотря на то, что мы не храним ссылки на них, похоже, что реализации PersistenceManager и Transaction Data Nucleus ссылаются на объект org.datanucleus.ObjectManagerImpl, который содержит список «грязных» объектов JDO. экземпляры (фактически копии оригинала). Вероятно, для этого есть веская причина, но я был немного удивлен тем, что инфраструктуре необходимо хранить копии каждого объекта JDO. Они отпускаются после фиксации, но, учитывая, что мы хотим, чтобы все вставки происходили атомарно, нам нужно запустить эту операцию внутри транзакции. В текущем состоянии использование памяти линейно коррелирует с размером входных данных, что открывает нам возможности возникновения ошибок OutOfMemoryError — если не для одной операции, то для параллельных операций.
Есть ли какие-либо советы или рекомендации по обеспечению максимально равномерного объема памяти для такой операции пакетной вставки JDO?
Подробнее здесь: https://stackoverflow.com/questions/167 ... do-inserts
Уменьшение использования памяти для пакетных вставок JDO ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение