Как оптимизировать работу собственных запросов Oracle с помощью собственных запросов в EJB (Oc4j)? - PullRequest
0 голосов
/ 11 марта 2011

У меня следующая проблема с базой данных EJB и Oracle.

У меня есть собственный SQL-запрос, развернутый в Oc4j, который возвращает более 21 тыс. Строк из базы данных Oracle.когда я выполняю запрос к базе данных Oracle, я получаю исключение JOOM (нехватка памяти).

И поскольку требовалось включить разбиение на страницы для набора результатов, поэтому мы решили использовать em.setMaxResult, em.setFirstResult длявозвращать только 10 строк за раз.

Использование EntityManager для реализации разбиения на страницы поставило нас перед некоторой проблемой. Как позже, требовалось отсортировать возвращаемый результат, но весь результат, а не только 10 строк, возвращаемыхsetMaxResult()!Мы обнаружили, что из-за предложения ORDER BY xxxx в собственном запросе производительность запроса становится слишком плохой.

Итак, мы рассматриваем разбиение на страницы на уровне базы данных (используя Oracle rownum или любой другой метод)..

Позже мы осознали, что, если мы используем em.clear(), мы сможем избежать исключения JOOM, сделав что-то вроде:

define the result list
while database has more records
{
   use entityManager get next 10 records and add them to the result list
   entityManager.clear();
}
return result list

Итак,мы могли бы реализовать подкачку на стороне сервлета (используя session.getAttribute("all_result").sublist(from, to)), и, таким образом, мы можем выполнить сортировку, используя Java в противоположность сортировке SQL.

1 Ответ

0 голосов
/ 19 марта 2011

Предоставленный код для нумерации страниц может помочь вам.

em.createQuery("Select o from Entity o where o.id > :lastId order by o.id");
query.setParameter("lastId", previousResult.get(previousResult.size()-1).getId());
query.setMaxResults(10);
...