sql >> Databáze >  >> RDS >> Mysql

Posouvatelná/aktualizovatelná sada výsledků MySQL nefunguje podle očekávání

Jak Mark Rotteveel zmiňuje v komentáři k otázce, MySQL standardně ukládá data ResultSet do mezipaměti (také diskutované v článku na blogu Bena J. Christensena zde ). Zjevným vedlejším efektem tohoto ukládání do mezipaměti je to, že MySQL Connector/J „upgraduje“ sadu výsledků TYPE_FORWARD_ONLY tak, aby byla skutečně rolovatelná:

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

zobrazí

Current row number: 3
Current row number: 2

Podle výše citovaného článku na blogu je způsob, jak zabránit ukládání do mezipaměti a „streamovat“ data ResultSet, použít 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());
}

výsledkem je

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


  1. Únikový řetězec Python pro MySQL

  2. Sledování synchronizace replik skupiny dostupnosti

  3. Jak provést dva mysql dotazy jako jeden v PHP/MYSQL?

  4. SSL připojení PHP k MySQL