sql >> データベース >  >> RDS >> Mysql

MySQLResultSetのスクロール可能/更新可能が期待どおりに機能しない

    Mark Rotteveelが質問へのコメントで言及しているように、MySQLはデフォルトでResultSetデータをキャッシュします(Ben J. Christensen ここ )。このキャッシングの明らかな副作用は、MySQL Connector/JがTYPE_FORWARD_ONLYResultSetを実際にスクロール可能に「アップグレード」することです。

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

    ディスプレイ

    Current row number: 3
    Current row number: 2
    

    上記のブログ記事によると、ResultSetデータのキャッシュと「ストリーミング」を防ぐ方法は、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());
    }
    

    結果として

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


    1. Visual StudioでSSISロードを実行しているときにODBC接続が失敗するのに、パッケージ実行ユーティリティを使用して同じパッケージを実行している場合は失敗するのはなぜですか

    2. MariaDBサーバーとMariaDBクラスターの比較

    3. JSON_ARRAY()–MySQLの値のリストからJSON配列を作成します

    4. MySQLではAUTO_INCREMENTのリセットに時間がかかります