Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL ResultSet rolável/atualizável não está funcionando conforme o esperado


Como Mark Rotteveel menciona em um comentário à pergunta, o MySQL armazena em cache os dados do ResultSet por padrão (também discutido em um artigo de blog de Ben J. Christensen aqui ). Um efeito colateral aparente desse cache é que o MySQL Connector/J "atualizará" um ResultSet TYPE_FORWARD_ONLY para realmente ser rolável:
Statement s = dbConnection.createStatement(
        ResultSet.TYPE_FORWARD_ONLY, 
        ResultSet.CONCUR_READ_ONLY);
ResultSet rs = s.executeQuery("SELECT * FROM testdata");
rs.last();
System.out.println(String.format("Current row number: %d", rs.getRow()));
rs.previous();
System.out.println(String.format("Current row number: %d", rs.getRow()));

exibe
Current row number: 3
Current row number: 2

De acordo com o artigo do blog citado acima, a maneira de evitar o armazenamento em cache e "transmitir" os dados do ResultSet é usar Statement.setFetchSize :
Statement s = dbConnection.createStatement(
        ResultSet.TYPE_FORWARD_ONLY, 
        ResultSet.CONCUR_READ_ONLY);
s.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = s.executeQuery("SELECT * FROM testdata");
rs.next();
System.out.println("Data from first row: " + rs.getString(2));
System.out.println("now let's try rs.last() ...");
try {
    rs.last();
    System.out.println("... Okay, done.");
} catch (Exception e) {
    System.out.println("... Exception: " + e.getMessage());
}

resultando em
Data from first row: Gord
now let's try rs.last() ...
... Exception: Operation not supported for streaming result sets