Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Que fait vraiment la méthode Statement.setFetchSize(nSize) dans le pilote SQL Server JDBC ?

Dans JDBC, le setFetchSize(int) La méthode est très importante pour les performances et la gestion de la mémoire au sein de la JVM car elle contrôle le nombre d'appels réseau de la JVM à la base de données et, par conséquent, la quantité de RAM utilisée pour le traitement ResultSet.

Par nature, si setFetchSize(10) est appelé et que le pilote l'ignore, il n'y a probablement que deux options :

  1. Essayez un pilote JDBC différent qui respectera l'indication de taille de récupération.
  2. Consultez les propriétés spécifiques au pilote sur la connexion (URL et/ou mappage de propriétés lors de la création de l'instance de connexion).

Le RESULT-SET est le nombre de lignes rassemblées sur la base de données en réponse à la requête. Le ROW-SET est le bloc de lignes extraites du RESULT-SET par appel de la JVM à la base de données. les appels et la RAM résultante requise pour le traitement dépendent du paramètre de taille de récupération.

Donc, si le RESULT-SET a 100 lignes et que la taille de récupération est de 10, il y aura 10 appels réseau pour récupérer toutes les données, en utilisant environ 10*{row-content-size} RAM à tout moment.

La taille de récupération par défaut est 10, ce qui est plutôt petit. Dans le cas affiché, il semblerait que le pilote ignore le paramètre de taille de récupération, récupérant toutes les données en un seul appel (grande RAM requise, appels réseau minimaux optimaux).

Que se passe-t-il sous ResultSet.next() est qu'il ne récupère pas réellement une ligne à la fois à partir du RESULT-SET. Il récupère cela à partir du ROW-SET (local) et récupère le prochain ROW-SET (de manière invisible) à partir du serveur au fur et à mesure qu'il est épuisé sur le client local.

Tout cela dépend du pilote car le paramètre n'est qu'un "indice", mais en pratique, j'ai trouvé que c'est ainsi que cela fonctionne pour de nombreux pilotes et bases de données (vérifié dans de nombreuses versions d'Oracle, DB2 et MySQL).