как разбить на страницы ResultSet

Frank
Уже с Приветом
Posts: 2019
Joined: 22 Jul 2000 09:01

как разбить на страницы ResultSet

Post by Frank »

Вот так как!!!

Хе-хе, потому-то MySQL так и популярен для создания web-страниц, что там есть несколько удобных команд, включая и LIMIT.
SELECT * FROM mytable WHERE ... ORDER BY ... LIMIT 1500, 10;

Ну, и скорость, канешна. Она позволяет строить довольно интересные приложения со сложными алгоритмами.
Andrey2
Уже с Приветом
Posts: 157
Joined: 13 Dec 1999 10:01
Location: Eburg/Russia -> Walnut Creek,CA,USA

как разбить на страницы ResultSet

Post by Andrey2 »

IMHO

1. Use ResultSet scrolling. ResultSet.absolutePage() is a shortcut (same idea, but would be completed by db server/driver, IMHO).

2. Limit the number of recordset, returned from stored procedure (something like select top 500 in sp; may be a property to java.sql.Statement). You will be hardly ever asked to show 20-th page of results, more likely you will be asked to sort results.

3. You may try to incapsulate both ideas inside your stored procedure.

Forget about session-dependent storing -- it consumes a lot of resources (runtime and delopment time). Sequental requests to database would probably use caching on db side.

MySQL LIMIT clause works (at least worked couple of years ago, AFAIK) the same way (limits with a number of resulting records and then scans through results) but on driver level.

Sorry for english,
Andy
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

как разбить на страницы ResultSet

Post by WildVlad »

Не типа, есть вот такой глупый вариант (я его уже как-то описывал).
Для начала нужно определиться будут ли пользователи чаще всего просматривать все страницы или ограничится, скорее всего первыми n из них.
Выбрав стратегию действуем так:
1. Просмотр всех страниц вероятен. Стартуем новую нить (делается через Bean, который на самом деле практически обычный java-класс в JSP), которая и сгенерит в temporary storage нужные страницы. Основная нить (обаботчик запросов броузера) же спрашивает у этной нити: А не готова ли страница номер k? И ждёт если не готова.
2. Наиболее вероятно, что пользователя задолбает смотреть результаты уже где-то на 5-6-...-10 й странице. Ну и генерим сразу кусками по 10 страниц. Если попросил, к примеру, 8-9, то мы смотрим: ага! Тык эта сволочь скоро и до 10-ой доберётся, так значит нам надо подготовить страницы 11-20, а страницы 1-6 можно и потереть (а можно и нет). При этом пропуск страниц можно тупо реализовать пропуская первые RowsPerPage*10 записей. Всё равно, из хранимой процедуры даже если и удастся создать Scrollable cursor, придётся их считывать, не вы сами, так драйвер за это вас сделает.

Тут даже вопрос то не в том, а вот в чём:
Раз у вас есть хранимая процедура, то может вы ей и сделатет параметром какие страницы она должна выплюнуть?
koreiko
Новичок
Posts: 39
Joined: 18 Nov 2001 10:01
Location: not for a while yet in Moscow

как разбить на страницы ResultSet

Post by koreiko »

Если JDBC 1.0, то похоже действительно нужно каждый раз бегать по всему ResultSet

А в версии 2.0 все намного проще:

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
// Recordset rs ;

int numberOfRecords = 0;
try {
if (rs.last()) {
numberOfRecords = rs.getRow();
rs.beforeFirst(); // возвращаем курсор на место, хотя можно сделать это и потом
}
} catch (SQLException e) {
System.out.println("Фак твою мать "+e.toString())
}
</pre><hr></blockquote>

Теперь имеем количество записей в ResultSet и можно выводить по тому же принципу, как и в ASP, типа как написал stockman
Для переходов по страницам используем код

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
void moveToPage (int pageNumber) {

try {
rs.absolute(10*(pageNumber-1)+1)
} catch (SQLException e) {}

}
</pre><hr></blockquote>

Приблизительно так, если я правильно понял, в чем проблема.

[ 20-11-2001: Message edited by: koreiko ]</p>
koreiko
Новичок
Posts: 39
Joined: 18 Nov 2001 10:01
Location: not for a while yet in Moscow

как разбить на страницы ResultSet

Post by koreiko »

2 keyik:

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>P.S. Пока писал ответ, увидел, что нечто подобное уже ответил koreiko [img:16b7f55136]images/smiles/icon_smile.gif[/img:16b7f55136]
<hr></blockquote>

Долго же ты ответ писал [img:16b7f55136]images/smiles/icon_biggrin.gif[/img:16b7f55136]
keyik
Новичок
Posts: 22
Joined: 14 Jun 2000 09:01
Location: Атланта

как разбить на страницы ResultSet

Post by keyik »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
for( int i=0; i<=startRec+pageSize && rs.next(); i++ )
{
if ( i>startRec && i<=startRec+pageSize )
doSomething();
}
</pre><hr></blockquote>[/qb]<hr></blockquote>

Webdeveloper, а чем не устраивает предложенный выше вариант? Только надо "next()" заменить на "absolute(int row)" и перед циклом надо будет подрегулировать "startRec" парой "if"-ов.

Чтобы работал "absolute(int row)", надо создать "Statement" c соотв.параметрами, что типа такого:

Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE).

Я уже точно не помню параметры [img:6db8f0cd40]images/smiles/icon_smile.gif[/img:6db8f0cd40] Идея в том, чтобы по курсору можно было "ездить" как хочешь, в любую сторону. В Оракле, в каталоге [ORACLE_HOME]/ora8i/jdbc/ есть примерчики на этот счет в виде zip-файла, по-моему, файл называется "ResultSet5.java" [img:6db8f0cd40]images/smiles/icon_smile.gif[/img:6db8f0cd40]

Дальше надо прилепить кнопки "Next", "Prev" и т.д. и по ним вызывать этe же jsp-страницу с параметром, что типа такого:

<%@ import "myproject.db.*" %>
<%
...
MyView mv = new MyView(); // это из "myproject.db.*"
int startRec = ....request.getParameter("start_row");
// проверку на null и прочие преобразования я опустил
...
%>
...
<a href="tview?start_row=<%= startRec + pageSize %>">Next</a>
<a href="tview?start_row=<%= startRec - pageSize %>">Prev</a>
...
<%
for(int i=0; i<=startRec + pageSize && mv.absolute(i); i++){ %>
<tr>
<td><%= mv.getColumn(1)%></td>
<td><%= mv.getColumn(2)%></td>
<td><%= mv.getColumn(3)%></td>
</tr>
<% } %>

Ну, надо еще добавить обработку ошибок и переадресовку на errorpage [img:6db8f0cd40]images/smiles/icon_smile.gif[/img:6db8f0cd40]

P.S. Пока писал ответ, увидел, что нечто подобное уже ответил koreiko [img:6db8f0cd40]images/smiles/icon_smile.gif[/img:6db8f0cd40]

[ 22-11-2001: Message edited by: keyik ]</p>

Return to “Вопросы и новости IT”