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

Comment lire toutes les lignes d'une immense table ?

La version courte est, appelez stmt.setFetchSize(50); et conn.setAutoCommit(false); pour éviter de lire tout le ResultSet en mémoire.

Voici ce que dit la documentation :

Obtenir des résultats basés sur un curseur

Par défaut, le pilote collecte tous les résultats de la requête en une seule fois. Cela peut être gênant pour les grands ensembles de données. Le pilote JDBC fournit donc un moyen de baser un ResultSet sur un curseur de base de données et de ne récupérer qu'un petit nombre de lignes.

Un petit nombre de lignes sont mises en cache côté client de la connexion et lorsqu'elles sont épuisées, le bloc de lignes suivant est récupéré en repositionnant le curseur.

Remarque :

  • Les ResultSets basés sur le curseur ne peuvent pas être utilisés dans toutes les situations. Il existe un certain nombre de restrictions qui obligeront le pilote à revenir silencieusement à la récupération de l'ensemble du résultat en une seule fois.

  • La connexion au serveur doit utiliser le protocole V3. Il s'agit de la valeur par défaut pour (et n'est pris en charge que par) les versions de serveur 7.4 et ultérieures.-

  • La connexion ne doit pas être en mode autocommit. Le backend ferme les curseurs à la fin des transactions, donc en mode autocommit, le backend aura fermé le curseur avant que quoi que ce soit ne puisse en être récupéré.-

  • La déclaration doit être créée avec un type ResultSet de ResultSet.TYPE_FORWARD_ONLY. C'est la valeur par défaut, donc aucun code n'aura besoin d'être réécrit pour en profiter, mais cela signifie également que vous ne pouvez pas faire défiler vers l'arrière ou sauter autrement dans le ResultSet.-

  • La requête donnée doit être une seule instruction, et non plusieurs instructions liées par des points-virgules.

Exemple 5.2. Définition de la taille de récupération pour activer et désactiver les curseurs.

Changer le code en mode curseur est aussi simple que de définir la taille de récupération de la déclaration à la taille appropriée. Remettre la taille de récupération à 0 entraînera la mise en cache de toutes les lignes (comportement par défaut).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();