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

(mysql jdbcを使用して)ストリーミング結果セットを閉じるには長い時間がかかります

    したがって、質問への私のコメントに投稿されているように、MySQLコネクタからの公式の回答は、結果セットを閉じるためにすべての結果セットをストリーミングする必要があるということです( http://dev.mysql.com/doc/refman/5.5/en/connector-j- reference-implementation-notes.html )。さらに、ストリーミング結果が実行されている間は、これ以上クエリを実行できません。

    完全に嫌なハックとして、私はリフレクションを使用して RowDataDynamicに行きました (ver。5.1.24)そして次のように中断された例外を偽造します:

        final Class<?> rdClass = rd.getClass();
        final Field isInterruptedField = rdClass.getDeclaredField("isInterrupted");
        isInterruptedField.setAccessible(true);  // override 'protected' visibility
        isInterruptedField.set(rd, true);
    

    ResultSetに到達するには、ハンドルを持っているオブジェクトをすべて下に移動する必要があることに注意してください。私にとっては、HibernateのScrollableResultsクラスを使用していました。これは、そこからResultSet参照(実際にはそのスーパークラス)を取得し、そこからRowDataを取得することを意味しました。

    これにより、残りの結果をストリーミングせずにクローズ操作を実行できますただし トランザクションをロールバックしようとすると、パケットサイズが一致しないために例外が発生します(これはキャッチして無視します)。接続プールとしてAtomikosを使用すると、問題が解決されると、次のいくつかの接続に関する警告が表示されますが、それでもすべて正常に機能します。

    明らかに、このアプローチはすべての人に役立つとは限りませんが、少なくとも、データベースクエリを介して処理を実行したり、結果をバッチで取得するためのより複雑なロジックを記述したりする場合の回避策は機能しません。




    1. すべてのテーブルのすべてのフィールドで特定の値を検索(Oracle)

    2. mysqlデータベースを作成および移行するための初期化子を作成するにはどうすればよいですか?

    3. mysqlの低速クエリログの回転

    4. MySQLクエリでLIMITを指定してSELECTを使用するときにすべての行をカウントするにはどうすればよいですか?