問題:
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;