разбиение на страницы на jsp с DB2 в качестве бэкэнда - PullRequest
2 голосов
/ 02 октября 2009

Я извлекаю тысячи строк из базы данных, но я хочу отобразить только около 200 на одном jsp. Я использую нумерацию страниц, создавая ссылки на следующие строки.

В настоящее время, используя DB2, единственное, что я могу сделать, это FETCH FIRST 200 строк. Таким образом, к тому времени, когда я попадаю на 5-ю страницу, я делаю FETCH FIRST 1000 строк, а затем я отображаю 800-1000.

Кто-нибудь может предложить лучшее решение, либо из jsp, но предпочтительно с точки зрения БД?

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

Спасибо.

Ответы [ 2 ]

5 голосов
/ 02 октября 2009

Вы можете использовать конструкцию row_number () over (), но это немного громоздко:

SELECT * FROM (
  SELECT your_column1, your_column2, ...,
         ROW_NUMBER() OVER (ORDER BY your_order_by ASC) AS rownumber
    FROM your_table
) AS row_
WHERE rownumber between 200 and 400;
0 голосов
/ 02 октября 2009

Я думаю, что было бы лучше использовать курсоры самостоятельно, чтобы вы фактически выполняли только один запрос. Вероятно, вы не используете мейнфрейм DB2, но версия LUW (Linux / Unix / Windows) также может иметь функцию для тайм-аута «плохо себя ведущих» сеансов (тех, которые удерживают блокировки ресурсов без активности), что предотвратит накопление осиротевших курсоров .

В DB2 / z вы должны установить IDTHTOIN на количество секунд, которое вы хотите использовать в качестве тайм-аута, и COMTSTAT = INACTIVE, чтобы защитить потоки, удерживающие ресурсы, которые были , показывая некоторую активность.

Но, как я уже сказал, вы, вероятно, используете LUW-версию, и я понятия не имею, имеет ли этот вариант аналогичную функциональность (я бы удивился, если бы этого не произошло).

Если у вас есть уникальный идентификатор, который вы можете использовать для каждой отображаемой записи, вы можете просто запомнить идентификатор последней в своем текущем списке, вместо:

select * from tbl fetch first 200 rows only

использование:

select * from tbl where id > id_of_last fetch first 200 rows only

Это, по крайней мере, уменьшит трафик, передаваемый по проводам.

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