responsabilidad: This blog post on SQL pagination & JDBC pagination is posted by me.
Caso omiso de hibernación paginación, podemos utilizar SQL paginación paginación/JDBC
SQL paginación
Hay dos enfoques básicos:
- operan fragmentario conjunto de resultados (Nueva consulta para cada página)
- operando en consecuencia el sistema completo del
La manera de hacerlo es SQL específica
para MySQL/muchos otros LSQ que se puede hacer con límite y compensar
PostgreSQL: http://microjet.ath.cx/WebWiki/ResultPaginationWithPostgresql.html
En Oracle, usa la misma forma que para manejar la "consulta Top-N", por ejemplo ¿quiénes son los 5 empleados mejor pagados, que está optimizado
select * from (select a.*, rownum rnum
from (YOUR_QUERY_GOES_HERE -- including the order by) a
where rownum <= MAX_ROWS)
where rnum >= MIN_ROWS
Here is a very detailed explanation on ROW-NUM
Similar SO Thread
JDBC paginación
La pregunta viene a la mente es: cuando ejecuto el SQL, cómo es el resultado que se carga? ¿Inmediatamente o bajo pedido? mismo que este SO hilo
primer lugar tenemos que entender algunas basics of JDBC, as from Oracle
por javadoc: Statement.execute()
execute: Returns true if the first object that the query returns is a ResultSet object. Use this method if the query could return one or more ResultSet objects. Retrieve the ResultSet objects returned from the query by repeatedly calling Statement.getResutSet.
Tenemos acceso a los datos en el conjunto de resultados a través de un cursor. Tenga en cuenta que este cursor es diferente del DB mientras que es un puntero inicialmente ubicado antes de la primera fila de datos.
Los datos se obtienen a petición. mientras que cuando haces la ejecución() estás buscando por primera vez.
Entonces, ¿cuántos datos se cargan? Es configurable Se puede usar el método java API setFetchSize() en ResultSet para controlar cuántas filas se extraen de DB cada vez por el controlador, qué tan grande son los bloques que recupera a la vez.
Por ejemplo, supongamos que el resultado total es 1000. Si el tamaño de búsqueda es 100, ir a la primera fila cargará 100 filas de DB y la 2ª a la 100ª fila se cargará desde la memoria local. Para consultar la 101ª fila, otras 100 filas serán cargar en la memoria.
De JavaDoc
Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.
Nota la palabra "pista" - que puede ser de anulación por la implementación específica del conductor.
Esto es también en lo que se basa la función "Limitar filas a 100" en clientes como SQL.
completar toda la solución, para desplazarse resultados, se deben considerar los tipos de ResultSet y ScrollableCursor en API
Uno puede encontrar un ejemplo de implementación de esta entrada en el oráculo
el cual es del libro de Oracle Toplink Guía del desarrollador Ejemplo 112 del controlador JDBC de Fetch Tamaño
ReadAllQuery query = new ReadAllQuery();
query.setReferenceClass(Employee.class);
query.setSelectionCriteria(new ExpressionBuilder.get("id").greaterThan(100));
// Set the JDBC fetch size
query.setFetchSize(50);
// Configure the query to return results as a ScrollableCursor
query.useScrollableCursor();
// Execute the query
ScrollableCursor cursor = (ScrollableCursor) session.executeQuery(query);
// Iterate over the results
while (cursor.hasNext()) {
System.out.println(cursor.next().toString());
}
cursor.close();
.....................
Después de todo, las preguntas hierven a
¿Cuál es la mejor manera de hacer la paginación?
Nota SQL debe ser ORDEN por tener sentido en el enfoque de SQL,
lo contrario, es posible mostrar algunas filas de nuevo en la página siguiente.
A continuación se muestra algunos puntos de la documentación de PostgreSQL en el controlador JDBC y otras respuestas para
En primer lugar, la consulta original tendría que tener una cláusula ORDER BY con el fin de hacer el trabajo de paginación solución razonable. De lo contrario, sería perfectamente válido para Oracle devolver las mismas 500 filas para la primera página, la segunda página y la enésima página
La principal diferencia es para la forma JDBC, se requiere para mantener la conexión durante el atractivo. Esto puede no ser adecuado en la aplicación web sin estado, por ejemplo.
Para SQL manera
la sintaxis SQL es específico y puede no ser fácil de mantener. para JDBC manera
- La conexión con el servidor debe estar utilizando el protocolo V3. Esto es el valor predeterminado para (y solo es compatible con) las versiones de servidor 7.4 y posteriores.
- La conexión no debe estar en modo de confirmación automática. El motor de fondo cierra los cursores al final de las transacciones, por lo que en el modo de confirmación automática el servidor habrá cerrado el cursor antes de que se pueda obtener cualquier cosa de él.
- La declaración debe crearse con un tipo ResultSet de ResultSet.TYPE_FORWARD_ONLY. Este es el valor predeterminado, por lo que no es necesario volver a escribir el código para aprovechar esto, pero también significa que no se puede desplazar hacia atrás o saltear el ResultSet.
- La consulta proporcionada debe ser una sola instrucción, no múltiples declaraciones encadenadas con punto y coma.
Algunos Lectura adicional
This post is about performance tuning with optical fetch size
Gracias por su respuesta.¿Hay alguna forma de lograr esta funcionalidad sin usar palabras clave SQL? – Zeeshan
@Zeeshan: no utiliza las API estándar de JDBC. –
estoy usando API estándar de JDBC con oracle 10g – Zeeshan