Подтвердить что ты не робот

Большое количество таблиц и потребление памяти в спящем режиме

Я работаю над крупным проектом ERP, который имеет модель базы данных с примерно 2100 таблицами. С "всего" 500 таблицами, сопоставленными с Hibernate, приложение, развернутое на веб-сервере, занимает около 3 ГБ рабочей памяти.

Есть ли способ уменьшить объем памяти метамодели Hibernate при использовании этого большого количества таблиц в одном модуле сохранения? Или я должен просто отказаться от ORM и пойти с простым старым JDBC (или даже jOOQ)?

Сейчас я использую Hibernate 4.1.8, Spring 3.1.3, JBoss AS 7.1 и работаю с базой данных MSSQL.

Edit:

вывод гистограммы памяти JavaMelody - с 2000 сгенерированными тестовыми таблицами, которые немного меньше по объему от исходной модели db (следовательно, "только" 1,3 ГБ отработанной памяти)

Изменить 2:

Анализ кучи Java MAT:

4b9b3361

Ответ 2

Открытый сеанс спящего режима будет иметь тенденцию накапливать объекты, поскольку он используется. Это не утечка памяти; сеанс гибернации предназначен для использования один раз для запроса и кэширует объекты, которые являются постоянными (т.е. живут в сеансе), а также запросы и другие данные. Если вы вызываете session.toString(), вы увидите список объектов, которые живут в сеансе.

Если вы работаете с очень большим количеством объектов, подумайте об обработке объектов партиями. Вы можете вызывать session.clear() после каждой партии, чтобы вырезать кешированные данные и постоянные объекты из сеанса и уменьшать объем памяти сеанса (иногда резко).

После вызова session.clear() имейте в виду, что объекты, загруженные до этого вызова, возвращаются в состояние отсоединения и больше не активны для текущего сеанса.

Вы также можете использовать ленивую выборку для оптимизации объема данных, которые требуется спящий режим для обработки данной операции. Подробнее об этом можно прочитать в документации по спящему режиму. Я бы рекомендовал включить функцию ведения журнала в режиме гибернации SQL и проверить, не сбрасывает ли hibernate данные, которые ему не нужны.

Вы также можете настроить спящий режим для сбора статистических данных, которые могут вам помочь:

sessionFactory.getStatistics().setStatisticsEnabled(true);

Ответ 3

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

Java-мелодия очень проста в интеграции, настройке и в производстве, которую вы можете включить или отключить, просто обновив web.xml

Ответ 4

Какова цель вашего объекта hibernate, hibernate подходит только для CURD (создавать, обновлять, читать, удалять), но не подходит для caculation. для любой цели окуливания (специально для перекрестного стола) лучше использовать процедуру хранения и ibatis.