54 votes

Comment lire toutes les lignes d'une table énorme?

J'ai un problème avec le traitement de toutes les lignes de la base de données (PostgreSQL). J'obtiens une erreur : org.postgresql.util.PSQLException: Ran out of memory retrieving query results. Je pense que je dois lire toutes les lignes en petits morceaux, mais cela ne fonctionne pas - il ne lit que 100 lignes (code ci-dessous). Comment faire ça?

     int i = 0;      
    Statement s = connection.createStatement();
    s.setMaxRows(100); // bacause of: org.postgresql.util.PSQLException: Ran out of memory retrieving query results.
    ResultSet rs = s.executeQuery("select * from " + tabName);      
    for (;;) {
        while (rs.next()) {
            i++;
            // do something...
        }
        if ((s.getMoreResults() == false) && (s.getUpdateCount() == -1)) {
            break;
        }           
    }

39voto

Frank Heikens Points 29270

Utilisez un CURSEUR dans PostgreSQL ou laissez le pilote JDBC gérer cela pour vous .

LIMIT et OFFSET seront lents lors de la gestion de grands ensembles de données.

0voto

marioosh Points 4673

Je l'ai fait comme ci-dessous. Pas la meilleure façon je pense, mais ça marche :)

     Connection c = DriverManager.getConnection("jdbc:postgresql://....");
    PreparedStatement s = c.prepareStatement("select * from " + tabName + " where id > ? order by id");
    s.setMaxRows(100);
    int lastId = 0;
    for (;;) {
        s.setInt(1, lastId);
        ResultSet rs = s.executeQuery();

        int lastIdBefore = lastId;
        while (rs.next()) {
            lastId = Integer.parseInt(rs.getObject(1).toString());
            // ...
        }

        if (lastIdBefore == lastId) {
            break;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X