Pergunta

Estou usando o DisplayTag para criar tabelas com dados do meu banco de dados. Isso funciona bem se a lista solicitada não for tão grande, mas se o tamanho da lista crescer mais de 2500 entradas, buscar a lista de resultados levará muito tempo (mais de 5 min.). Eu queria saber se esse comportamento é normal.

Como você lida com a grande lista / consultas que retornam grandes resultados?

Foi útil?

Solução

Este artigo Links para um exemplo de aplicativo de como resolver o problema. O DisplayTag espera ser passado um conjunto de dados completo para criar links de paginação e lidar com a classificação. Isso quebra a idéia de pagar externamente nos dados e buscar apenas as linhas solicitadas (como as páginas do usuário para eles). O projeto vinculado no artigo descreve como definir esse tipo de coisa.

Se você estiver trabalhando com um grande banco de dados, também pode ter um problema em executar sua consulta. Presumo que você tenha descartado isso. Caso contrário, você tem o SQL, como mencionado anteriormente - eu o executaria no analisador de consulta DB2 para ver se existem gargalos de banco de dados. A próxima etapa da corrente é executar um teste da chamada de hibernato/dao em um teste de unidade sem exibição no mix. Novamente, de como você escreveu coisas, parece que você já fez isso.

Outras dicas

O DisplayTag transporta e armazena tudo na memória (a sessão). Hibernate também faz isso. Você não quer ter todo o conteúdo da tabela de banco de dados de uma só vez na memória (no entanto, se a desaceleração já começar a 2500 linhas, parece mais uma questão de uma questão de consulta SQL / dB de maneira muito otimizada; 2500 linhas devem ser amendoimes para A DB decente, mas ok, isso é outra história).

Em vez disso, crie uma tabela HTML com pouca ajuda de Jstl c:forEach E uma foto de El. Mantenha um ou dois parâmetros de solicitação em segundo plano em input type="hidden": a primeira linha a ser exibida (firstrow) e eventualmente a quantidade de linhas a serem exibidas de uma só vez (rowcount).

Então, na sua aula do DAO, apenas faça um SELECT stuff FROM data LIMIT firstrow OFFSET rowcount ou algo assim, dependendo do banco de dados usado. Em Mysql e PostgreSQL, você pode usar o LIMIT e/ou OFFSET Cláusula assim. No Oracle, você precisará disparar uma subconsulta. No MSSQL e DB2, você precisará criar um sp. Você pode fazer isso com o HQL.

Em seguida, para página através da tabela, basta ter muitos botões que instruem o código do servidor para dentro/decrementar o firstrow com rowcount toda vez. Apenas faça as contas.

Editar: Você comentou que está usando o DB2. Eu fiz um pouco de pesquisa e parece que você pode usar a função OLAP UDB ROW_NUMBER() por esta:

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;

Este exemplo deve retornar as 10 primeiras linhas do data tabela. Você pode parametrizar esta consulta para que você possa reutilizá -la para cada página. Isso é mais eficiente do que consultar toda a tabela na memória de Java. Certifique -se também de que a tabela seja indexada corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top