Pregunta

Estoy usando displaytag para construir tablas con datos de mi db. Esto funciona bien si la lista solicitada no es tan grande, pero si el tamaño de la lista crece más de 2500 entradas, ir a buscar la lista de resultados toma mucho tiempo (más de 5 min.). Me preguntaba si este comportamiento es normal.

¿Cómo manejar la lista de grandes / consultas que devuelven grandes resultados?

¿Fue útil?

Solución

enlaces Este artículo a un ejemplo de aplicación cómo hacer para resolver el problema. Displaytag espera ser aprobado un conjunto de datos completo para crear enlaces de paginación y el mango de clasificación. Este tipo de roturas de la idea de paginación externamente en los datos y ir a buscar sólo las filas que se hacen para (como las páginas de usuario a ellos). El proyecto vinculado en el artículo describe cómo hacer para establecer este tipo de cosas para arriba.

Si está trabajando con una gran base de datos, que también podría tener un problema al ejecutar la consulta. Asumo que ha descartado esta posibilidad. Si no es así, usted tiene el SQL como se mencionó anteriormente - Me ejecutarlo a través del analizador de consultas de DB2 para ver si existen obstáculos DB. El siguiente paso en la cadena es ejecutar una prueba de la llamada / DAO Hibernate en una prueba unidad sin displaytag en la mezcla. Una vez más, desde la forma en que has redactada así las cosas, parece que ya has hecho esto.

Otros consejos

El displaytag lances y tiendas de todo en la memoria (la sesión). Hibernate también lo hace. Usted no quiere tener todo el contenido de la tabla de base de datos a la vez en la memoria (sin embargo, si la desaceleración que ya comienza en 2500 filas, más se parece a una cuestión de consulta SQL mal optimizado / DB mesa; 2500 filas debe ser cacahuetes para una DB decente, pero está bien, eso es otra historia).

En lugar de crear una tabla HTML a sí mismo con poca ayuda de JSTL c:forEach una inyección de EL . Mantenga una o dos parámetros de la petición en el fondo en input type="hidden":. La primera fila a visualizar (firstrow) y, finalmente, la cantidad de filas que se muestran a la vez (rowcount)

A continuación, en la clase DAO acaba de hacer una SELECT stuff FROM data LIMIT firstrow OFFSET rowcount o algo por el estilo en función de la base de datos utilizada. En MySQL y PostgreSQL puede utilizar el LIMIT y / o cláusula OFFSET así. En Oracle que necesita para disparar una subconsulta. En MSSQL y DB2 que necesita para crear un SP. Usted puede hacer eso con HQL.

A continuación, a la página a través de la mesa, sólo hay unos botones de racimo que indica al código del lado del servidor en / disminuir el firstrow con cada rowcount. Sólo hacer los cálculos.

Editar : te comento que está utilizando DB2. He hecho un poco de investigación y parece que se puede utilizar la función ROW_NUMBER() UDB OLAP para esto:

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;

En este ejemplo se debe devolver las primeras 10 filas de la tabla data. Puede parametrizar esta consulta de manera que se puede reutilizar para cada página. Esto es más eficiente que la consulta de toda la tabla en la memoria de Java. También asegúrese de que la tabla está indexada correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top