Domanda

sto usando displaytag per costruire tabelle con i dati dal mio db. Questo metodo funziona bene se la lista richiesta non è grande ma se la dimensione lista cresce oltre 2500 voci, andare a prendere l'elenco dei risultati prende molto lungo (più di 5 min.). Mi chiedevo se questo comportamento è normale.

Come si gestisce grande elenco / query che restituiscono grandi risultati?

È stato utile?

Soluzione

collegamenti questo articolo ad esempio un'applicazione di come fare per risolvere il problema. Displaytag si aspetta di essere superato un set di dati completo per creare collegamenti di paginazione e gestire l'ordinamento. Questo tipo di interruzioni dell'idea di paging esternamente sui dati e recupero solo le righe che sono chiesti (come le pagine utente a loro). Il progetto legato in questo articolo viene descritto come fare per impostare questo tipo di cosa in su.

Se si lavora con un database di grandi dimensioni, si potrebbe anche avere un problema di esecuzione di query. Presumo che avete governato questo fuori. In caso contrario, si ha la SQL come accennato in precedenza - Vorrei correre attraverso l'analizzatore di query DB2 per vedere se ci sono eventuali colli di bottiglia DB. Il passo successivo è la catena per eseguire un test di chiamata / DAO Hibernate in un test senza displaytag nel mix. Anche in questo caso, da come hai formulato le cose, sembra che tu hai già fatto questo.

Altri suggerimenti

Il Displaytag cale e memorizza tutto nella memoria (la sessione). Hibernate fa anche questo. Se non si desidera avere l'intero contenuto della tabella DB in una sola volta in memoria (tuttavia, se il rallentamento inizia già a 2500 righe, più l'aspetto di una questione di query SQL mal ottimizzato / DB tavolo; 2500 righe dovrebbe essere noccioline per un DB decente, ma OK, questa è un'altra storia).

Piuttosto creare una tabella HTML soli con poco aiuto di JSTL c:forEach un colpo di EL . Mantenere uno o due parametri di richiesta in background in input type="hidden":. La prima riga da visualizzare (firstrow) e, infine, la quantità di righe da visualizzare in una sola volta (rowcount)

Poi, nella tua classe DAO Basta fare una SELECT stuff FROM data LIMIT firstrow OFFSET rowcount o qualcosa del genere a seconda del DB utilizzato. In MySQL e PostgreSQL è possibile utilizzare il LIMIT e / o la clausola OFFSET del genere. In Oracle avrete bisogno di sparare un subquery. In MSSQL e DB2 è necessario creare un SP. È possibile farlo con HQL.

Quindi, la pagina attraverso la tabella, hanno appena un mazzo pulsanti che ordina il codice lato server al / diminuire il firstrow con rowcount ogni volta. Basta fare due conti.

Modifica : si ha commentato che si sta utilizzando DB2. Ho fatto un po 'di ricerca e sembra che è possibile utilizzare la funzione di ROW_NUMBER() UDB OLAP per questo:

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;

Questo esempio dovrebbe restituire le prime 10 righe della tabella data. È possibile parametrizzare questa query in modo da poter riutilizzare per ogni pagina. Questo è più efficiente di interrogare l'intera tabella in memoria di Java. Assicurarsi inoltre che la tabella sia correttamente indicizzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top