12
votes

Groovy SQL Méthode de chaque rowow et de lignes

Je suis nouveau à Grails et Groovy. Quelqu'un peut-il vous expliquer la différence entre ces deux méthodes SQL Groovy xxx

aussi, ce qui est plus efficace?

Je travaille sur une application qui récupère des données de la base de données (les Resulatset est très énorme) et l'écrit au fichier CSV ou renvoie un format JSON.

Je me demandais lequel des deux méthodes mentionnées ci-dessus à utiliser pour que le processus soit effectué plus rapidement et efficace.


0 commentaires

3 Réponses :


3
votes

Ils diffèrent uniquement dans la signature - Définit la pagination , donc les deux seront efficaces. Utilisez ce qui correspond à votre code.


2 commentaires

Ils sont réellement différents dans ce qu'ils retournent: les rangées () renvoie un groovyrowresult, alors que dans chaque rowow (), le IT est un groovyresultsetset


Pour élaborer le commentaire de @ Jefflowery: l'argument de fermeture représentant la ligne actuelle est écrasé sur chaque appel à chaquerow () .



26
votes

Quelqu'un peut-il vous expliquer le différence entre ces deux groovy Méthodes SQL SQL.ECHROW SQL.ROWS P>

Il est difficile de dire exactement quelles méthodes que vous faites référence 2 car il existe un grand nombre de versions surchargées de chaque méthode. Cependant, dans tous les cas, chaquerow code> ne renvoie rien p> xxx pré>

tandis que lignes code> renvoie une liste de lignes p> XXX PRE>

Donc, si vous utilisez chaquerow code>, la fermeture passée sous car le deuxième paramètre doit gérer chaque ligne, par exemple P>

rows("select * from PERSON where lastname = 'murphy'").each {row ->
    println "$row.firstname"        
}


0 commentaires

3
votes

Si nous mettons de côté des différences de syntaxe mineures, une différence semble importante. Examinons xxx

vs xxx

Le premier ouvre la connexion, récupère les résultats, ferme la connexion et les renvoie. Maintenant, vous pouvez itérer sur les résultats pendant que la connexion est libérée. L'inconvénient est que vous avez maintenant une liste de résultats complète en mémoire qui, dans certains cas, pourrait être beaucoup.

Chaque row d'autre part ouvre une connexion et tout en maintenant OUVERT OUVERT exécute votre fermeture pour chaque ligne. Si votre fermeture fonctionne sur la base de données et nécessite une autre connexion, votre code consommera deux connexions de la piscine en même temps. La connexion utilisée par chaquerow est libérée après son itération bien que toutes les lignes résultantes. De plus, si vous n'effectuez aucune opération de base de données, la fermeture prend un certain temps pour exécuter, vous bloquerez une connexion de base de données jusqu'à ce que chaquerow se termine.

Je ne suis pas sûr à 100% mais éventuellement chaque row vous permet de ne pas garder toutes les lignes résultantes en mémoire mais accèdent à un curseur - cela peut dépendre du pilote de base de données.

Si vous n'effectuez aucune opération de base de données dans votre fermeture, la fermeture exécute rapidement et la liste des résultats est assez grande pour Mémoire d'impact alors j'irais pour Chaquerow . Si vous effectuez des opérations de DB à l'intérieur de la fermeture ou que chaque appel de fermeture prend un temps significatif pendant que la liste des résultats est gérable, optez pour lignes .


0 commentaires