2015-11-06 4 views
0

Я написал довольно простой отчет для клиента в Java/JSF, который в основном возвращает строки из таблицы в базе данных mysql на основе некоторых простых критериев поиска (дата начала и окончания и т. Д.). Эта база данных содержит огромное количество строк, но в прошлом было ограничение, что возвращаются только строки определенного типа, и эти строки составляют около 1% от таблицы.Как обращаться с java.lang.OutOfMemoryError: верхний предел GC превышен изящно?

Недавно клиент попросил меня добавить к критериям поиска флажок, позволяющий им обойти ограничение на возвращаемые строки. Если вы установите этот флажок и оставьте широкий диапазон дат, можно попробовать получить массив ResultSet, после чего пользователь перенаправляется на страницу с ошибкой Glassfish с приятным сообщением: java.lang.OutOfMemoryError: верхний предел GC.

Каждый ответ на сообщения, которые я нашел о том, что касается этой ошибки, в основном говорит «Не поймайте ошибки памяти», и я понимаю, почему: вы не можете предсказать, где будет отображаться ошибка OOM, даже если вы знаете, где это происходит.

Я хотел бы знать, как обращаться с этим более изящно, чем с страницей с ошибкой Glassfish. В идеале я хотел бы просто вернуть пользователя на страницу поиска с сообщением о том, чтобы сузить критерии, если критерии были слишком широкими. Есть ли хороший способ сделать это до того, как я исчерпаю память? Или это лучшее решение, чтобы поставить произвольный лимит на результаты поиска (возможно, сначала запустите запрос с count(), и если он вернется больше, чем X, вернитесь на страницу поиска с сообщением об ошибке?)

+0

Да, это не сделано по уважительной причине. Это указывает на реальную ошибку, а не только на исключение. Ваши параметры состоят в том, чтобы разбивать страницы на данные, получать результаты, не сохраняя их в памяти или увеличивая кучу. – jiggy

+0

для получения результатов неограниченного размера, вы должны использовать их вместо них. например с помощью подхода на основе курсора и потоковой передачи вывода http – the8472

ответ

0

Я думаю, что Лучший способ - использовать разбиение на страницы. Сколько записей пользователя действительно может видеть на экране? Скажем 100. Итак, вы отобразите первые 100 строк и навигатор на следующую страницу со следующими 100 строками. Но, конечно, это зависит от требований бизнеса.

0

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

E.g. с помощью подхода на основе курсора и потоковой передачи вывода http. Таким образом, серверу необходимо будет поддерживать ограниченное количество состояний, а в худшем случае браузер пользователя становится непригодным из-за большой страницы.

Смежные вопросы