Вот так как!!!
Хе-хе, потому-то MySQL так и популярен для создания web-страниц, что там есть несколько удобных команд, включая и LIMIT.
SELECT * FROM mytable WHERE ... ORDER BY ... LIMIT 1500, 10;
Ну, и скорость, канешна. Она позволяет строить довольно интересные приложения со сложными алгоритмами.
как разбить на страницы ResultSet
-
- Уже с Приветом
- Posts: 157
- Joined: 13 Dec 1999 10:01
- Location: Eburg/Russia -> Walnut Creek,CA,USA
как разбить на страницы ResultSet
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
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
-
- Уже с Приветом
- Posts: 3982
- Joined: 13 Jul 2000 09:01
- Location: SVX -> BOS -> BUR -> SJC
как разбить на страницы ResultSet
Не типа, есть вот такой глупый вариант (я его уже как-то описывал).
Для начала нужно определиться будут ли пользователи чаще всего просматривать все страницы или ограничится, скорее всего первыми n из них.
Выбрав стратегию действуем так:
1. Просмотр всех страниц вероятен. Стартуем новую нить (делается через Bean, который на самом деле практически обычный java-класс в JSP), которая и сгенерит в temporary storage нужные страницы. Основная нить (обаботчик запросов броузера) же спрашивает у этной нити: А не готова ли страница номер k? И ждёт если не готова.
2. Наиболее вероятно, что пользователя задолбает смотреть результаты уже где-то на 5-6-...-10 й странице. Ну и генерим сразу кусками по 10 страниц. Если попросил, к примеру, 8-9, то мы смотрим: ага! Тык эта сволочь скоро и до 10-ой доберётся, так значит нам надо подготовить страницы 11-20, а страницы 1-6 можно и потереть (а можно и нет). При этом пропуск страниц можно тупо реализовать пропуская первые RowsPerPage*10 записей. Всё равно, из хранимой процедуры даже если и удастся создать Scrollable cursor, придётся их считывать, не вы сами, так драйвер за это вас сделает.
Тут даже вопрос то не в том, а вот в чём:
Раз у вас есть хранимая процедура, то может вы ей и сделатет параметром какие страницы она должна выплюнуть?
Для начала нужно определиться будут ли пользователи чаще всего просматривать все страницы или ограничится, скорее всего первыми n из них.
Выбрав стратегию действуем так:
1. Просмотр всех страниц вероятен. Стартуем новую нить (делается через Bean, который на самом деле практически обычный java-класс в JSP), которая и сгенерит в temporary storage нужные страницы. Основная нить (обаботчик запросов броузера) же спрашивает у этной нити: А не готова ли страница номер k? И ждёт если не готова.
2. Наиболее вероятно, что пользователя задолбает смотреть результаты уже где-то на 5-6-...-10 й странице. Ну и генерим сразу кусками по 10 страниц. Если попросил, к примеру, 8-9, то мы смотрим: ага! Тык эта сволочь скоро и до 10-ой доберётся, так значит нам надо подготовить страницы 11-20, а страницы 1-6 можно и потереть (а можно и нет). При этом пропуск страниц можно тупо реализовать пропуская первые RowsPerPage*10 записей. Всё равно, из хранимой процедуры даже если и удастся создать Scrollable cursor, придётся их считывать, не вы сами, так драйвер за это вас сделает.
Тут даже вопрос то не в том, а вот в чём:
Раз у вас есть хранимая процедура, то может вы ей и сделатет параметром какие страницы она должна выплюнуть?
-
- Новичок
- Posts: 39
- Joined: 18 Nov 2001 10:01
- Location: not for a while yet in Moscow
как разбить на страницы ResultSet
Если 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>
А в версии 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>
-
- Новичок
- Posts: 39
- Joined: 18 Nov 2001 10:01
- Location: not for a while yet in Moscow
как разбить на страницы ResultSet
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]
<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]
-
- Новичок
- Posts: 22
- Joined: 14 Jun 2000 09:01
- Location: Атланта
как разбить на страницы ResultSet
<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>
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>