2009-12-17 7 views
1

J'utilise displaytag pour construire des tables avec des données de mon db. Cela fonctionne bien si la liste demandée n'est pas très grande mais si la taille de la liste augmente de plus de 2500 entrées, l'extraction de la liste de résultats prend beaucoup de temps (plus de 5 minutes). Je me demandais si ce comportement est normal.Hibernate displaytag grandes listes

Comment gérez-vous les grandes listes/requêtes qui donnent de gros résultats?

+0

ce n'est pas normal. donne plus de détails sur votre configuration, configuration, contexte réseau, etc. – Bozho

+0

J'interroge une base de données DB2 avec une grande quantité de données. La configuration sont des portlets JSR-168 qui utilisent Spring 2.5.6 pour mes DAO. La requête est très complexe et comprend quelques exceptions et IN (Selects ..) Serveur et Db sont sur la même machine – onigunn

+0

Comment la requête s'exécute dans un client SQL? –

Répondre

1

This article des liens vers un exemple d'application de la façon de résoudre le problème. Displaytag s'attend à recevoir un ensemble de données complet pour créer des liens de pagination et gérer le tri. Ce genre de casse l'idée de paginer de manière externe sur les données et de ne récupérer que les lignes demandées (comme les pages de l'utilisateur). Le projet lié dans l'article décrit comment mettre en place ce type de chose.

Si vous travaillez avec une base de données volumineuse, vous pouvez également rencontrer un problème lors de l'exécution de votre requête. Je suppose que vous avez exclu cela. Si ce n'est pas le cas, vous avez le SQL comme mentionné plus haut - je l'exécuterais dans l'analyseur de requêtes DB2 pour voir s'il y a des goulots d'étranglement de DB. L'étape suivante de la chaîne consiste à exécuter un test de l'appel Hibernate/DAO dans un test unitaire sans displaytag dans le mixage. Encore une fois, d'après ce que vous avez dit, il semble que vous l'ayez déjà fait.

0

Le Displaytag déplace et stocke tout dans la mémoire (la session). Hibernate le fait aussi. Vous ne voulez pas avoir tout le contenu de la table de base de données à la fois en mémoire (cependant, si le ralentissement commence déjà à 2500 lignes, cela ressemble plus à une requête SQL/table DB mal optimisée, 2500 lignes doivent être des arachides DB décent, mais OK, c'est une autre histoire). Créez plutôt vous-même une table HTML avec l'aide de JSTLc:forEach et une prise de EL. Gardez un ou deux paramètres de requête en arrière-plan dans input type="hidden": la première ligne à afficher (firstrow) et éventuellement la quantité de lignes à afficher en une fois (rowcount).

Ensuite, dans votre classe DAO, faites simplement SELECT stuff FROM data LIMIT firstrow OFFSET rowcount ou quelque chose comme ça en fonction du DB utilisé. En MySQL et PostgreSQL, vous pouvez utiliser la clause LIMIT et/ou OFFSET comme ça. Dans Oracle, vous devez déclencher une sous-requête. Dans MSSQL et DB2, vous devrez créer un SP. Vous pouvez le faire avec HQL. Ensuite, pour feuilleter la table, il suffit d'avoir un ensemble de boutons qui indique au code côté serveur d'entrer/décrémenter le firstrow avec rowcount à chaque fois. Fais juste le calcul.

Modifier: vous avez indiqué que vous utilisiez DB2. Je l'ai fait un peu de recherche et il semble que vous pouvez utiliser la fonction OLAP UDB ROW_NUMBER() pour cela:

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; 

Cet exemple doit retourner les 10 premières lignes de la table data. Vous pouvez paramétrer cette requête afin de pouvoir la réutiliser pour chaque page. C'est plus efficace que d'interroger toute la table dans la mémoire de Java. Assurez-vous également que la table est correctement indexée.

Questions connexes