sql >> Database >  >> RDS >> Mysql

MySQL ResultSet schuifbaar/bijwerkbaar werkt niet zoals verwacht

Zoals Mark Rotteveel in een opmerking op de vraag vermeldt, slaat MySQL standaard ResultSet-gegevens op (ook besproken in een blogartikel van Ben J. Christensen hier ). Een duidelijk neveneffect van deze caching is dat MySQL Connector/J een TYPE_FORWARD_ONLY ResultSet zal "upgraden" om daadwerkelijk te kunnen scrollen:

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()));

geeft weer

Current row number: 3
Current row number: 2

Volgens het hierboven aangehaalde blogartikel is de manier om caching te voorkomen en de ResultSet-gegevens te "streamen" het gebruik van 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());
}

resulterend in

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


  1. 10 redenen waarom uw bedrijf Microsoft Access nodig heeft

  2. mysql selecteer verschillende rijen in een door komma's gescheiden lijstkolom

  3. Geen ondersteuning voor OVER in MS SQL Server 2005?

  4. Een gegevensmodel voor dierenverzorging