2009-12-17 4 views
1

Я использую displaytag для построения таблиц с данными из моего db. Это хорошо работает, если запрошенный список не такой большой, но если размер списка превышает 2500 записей, выборка списка результатов занимает очень много времени (более 5 минут). Мне было интересно, нормально ли это поведение.Hibernate displaytag большие списки

Как вы обрабатываете большой список/запросы, которые возвращают большие результаты?

+0

это НЕ нормально. дать более подробную информацию о вашей конфигурации, настройке, сетевом контексте и т. д. – Bozho

+0

Я запрашиваю базу данных DB2 с большим объемом данных. Конфигурация - портлеты JSR-168, которые используют Spring 2.5.6 для моих DAO. Запрос очень сложный и включает некоторые исключения и IN (Selects ..) Сервер и Db находятся на одной машине – onigunn

+0

Как выполняется запрос в SQL-клиенте? –

ответ

1

This article ссылки на пример приложения, как решить проблему. Displaytag ожидает передачи полного набора данных для создания пейджинговых ссылок и обработки сортировки. Этот вид нарушает идею вывода страниц извне и выводит только те строки, которые запрашиваются (в качестве пользовательских страниц для них). В проекте, приведенном в статье, описывается, как это сделать.

Если вы работаете с большой базой данных, у вас также может возникнуть проблема с выполнением запроса. Я предполагаю, что вы это исключили. Если нет, у вас есть SQL, как упоминалось ранее - я бы запустил его через анализатор запросов DB2, чтобы узнать, есть ли какие-либо узкие места в БД. Следующим шагом вверх по цепи является запуск теста вызова Hibernate/DAO в единичном тесте без отображения в миксе. Опять же, из того, как вы сформулировали что-то, похоже, что вы уже это сделали.

0

Дисплей отображает и сохраняет все в памяти (сеанс). Hibernate также делает это. Вы не хотите, чтобы содержимое всей таблицы БД было сразу в памяти (однако, если замедление уже начинается с 2500 строк, это больше похоже на проблему плохо оптимизированной таблицы SQL-запросов/БД, 2500 строк должны быть арахисами для достойная БД, но хорошо, это еще одна история).

Скорее создайте HTML-таблицу самостоятельно с небольшой помощью JSTLc:forEach и выстрелом EL. Сохраняйте один или два параметра запроса в фоновом режиме в input type="hidden": первая строка, которая будет отображаться (firstrow), и в конечном итоге количество строк, которое будет отображаться сразу (rowcount).

Затем в вашем классе DAO просто выполните SELECT stuff FROM data LIMIT firstrow OFFSET rowcount или что-то в этом духе в зависимости от используемой БД. В MySQL и PostgreSQL вы можете использовать предложение LIMIT и/или OFFSET. В Oracle вам нужно запустить подзапрос. В MSSQL и DB2 вам нужно создать SP. Вы можете сделать это с помощью HQL.

Затем, чтобы просмотреть страницу через стол, просто используйте кнопки сгустка, которые инструктируют код на стороне сервера, чтобы в/уменьшать firstrow с rowcount каждый раз. Просто делайте математику.

Редактировать: вы отметили, что используете DB2. Я сделал немного исследований, и кажется, что вы можете использовать функцию UDB OLAP ROW_NUMBER() для этого:

SELECT id, colA, colB, colC 
    FROM (
     SELECT 
      ROW_NUMBER() OVER (ORDER BY id) AS row, id, colA, colB, colC 
     FROM 
      data 
     ) AS temp_data 
    WHERE 
     row BETWEEN 1 AND 10; 

Этот пример должен возвращать первые 10 строк из data таблицы. Вы можете параметризовать этот запрос, чтобы его можно было повторно использовать для каждой страницы. Это более эффективно, чем запрос всей таблицы в памяти Java. Также убедитесь, что таблица правильно проиндексирована.

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