0

問題:

DB(MySQL) (1 000 000 行以上) から大きな ResultSet を取得し、各行を約 40 秒処理します。要約すると、私は ResultSet を 30 分以上使用していますが、データベース テーブルに実際に含まれているよりも少ないレコードを取得し、エラーも警告もありません。そのResultSetの行数を数えれば大丈夫です(ResultSetの数=DBの数)。

mysql サーバーまたは mysql jdbc ドライバーなどの制限はありますか?

私のコード。それは春のフレームワークで動作します:

 public void query(String query, RowCallbackHandler rowCallbackHandler) throws SQLException {
    ResultSet rs = null;
    ResultSet rsCount = null;
    Statement stmt = null;
    Statement stmtCount = null;
    try {
        stmt = createStatmant();

        rs = stmt.executeQuery(query);

        if (rs == null) {
            log.info("result set is null");
        }

        stmtCount = createStatmant();
        rsCount = stmtCount.executeQuery(query);
        int i = 0;
        while(rsCount.next()){
            i++;
        }
        log.info("ResultSet size : "+i);

        int j = 0;
        rs.next();
        do{
            j++;
            rowCallbackHandler.processRow(rs);
        }while (rs.next());
        log.info("ResultSet size real : "+i);
        log.info("ResultSet size fact : "+j);
    } catch (SQLException e) {
        throw new RuntimeException(e.getMessage());
    }finally{
        if(stmt!=null){
            stmt.close();
        }
        if(rs!=null){
            rs.close();
        }
        if(rsCount!=null){
            rsCount.close();
        }
    }
  }

createStatement :

  private Statement createStatmant() throws SQLException {

    ((BasicDataSource)dataSource).setTimeBetweenEvictionRunsMillis(1000*60*60);
    Statement stmt = dataSource.getConnection().createStatement(
            ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    stmt.setFetchSize(fetchSize);
    stmt.setMaxRows(50000000-1);    
    return stmt;
}    

datasource はクラスのグローバル変数です:

    private javax.sql.DataSource dataSource;
4

1 に答える 1

0

変更可能なオブジェクト rs を callbackHandler に渡しています。ResultSet を進めたり閉じたりしていないことを確認してください。

メソッドの上部で閉じることができる 4 つのオブジェクトを宣言しますが、下部では 3 つしか閉じません。stmtCount を閉じることを忘れないでください。

あなたは私たちの利益のためのトラブルシューティング アプローチとしてその数を実行していると思いますが、本番環境ではそうしていないと思います。

100 万行× 40 秒 = 4000 万秒 = 463 日。数学は、「各行を約 40 秒処理する」というステートメントをサポートしていません。

読んでいるときに、データベースに外部から何かが書き込まれていますか?

ログのカウントを比較できる場合は、例外がスローされていないことを意味します。それは有用な手がかりです。

于 2013-03-20T09:12:24.980 に答える