私の問題はこれです:MySQLからのJDBCTemplateを介してSpringで約150万行のデータを処理しようとしています。このように多数の行があるため、ここで提案されているようにRowCallbackHandlerクラスを使用しています。
コードは実際には機能していますが、遅いです...フェッチサイズを何に設定しても、フェッチごとに約350レコードを取得しているように見えますが、フェッチ間に2〜3秒の遅延があります(ログの監視から) 。storeコマンドをコメントアウトしてみたところ、動作が変わらないことを確認したので、書き込みに問題はありません。
6つの列があり、1つだけがvarcharであり、その1つは25文字しかないため、スループットが問題になることはわかりません。
理想的には、一度に30000〜50000行のようにしたいと思います。それを行う方法はありますか?
これが私のコードです:
protected void runCallback(String query, Map params, int fetchSize, RowCallbackHandler rch)
throws DatabaseException {
int oldFetchSize = getJdbcTemplate().getFetchSize();
if (fetchSize > 0) {
getJdbcTemplate().setFetchSize(fetchSize);
}
try {
getJdbcTemplate().query(getSql(query), rch);
}
catch (DataAccessException ex) {
logger.error(ExceptionUtils.getStackTrace(ex));
throw new DatabaseException( ex.getMessage() );
}
getJdbcTemplate().setFetchSize(oldFetchSize);
}
and the handler:
public class SaveUserFolderStatesCallback implements RowCallbackHandler {
@Override
public void processRow(ResultSet rs) throws SQLException {
//Save each row sequentially.
//Do NOT call ResultSet.next() !!!!
Calendar asOf = Calendar.getInstance();
log.info("AS OF DATE: " + asOf.getTime());
Long x = (Long) rs.getLong("x");
Long xx = (Long) rs.getLong("xx");
String xxx = (String) rs.getString("xxx");
BigDecimal xxxx = (BigDecimal)rs.getBigDecimal("xxxx");
Double xxxx = (budgetAmountBD == null) ? 0.0 : budgetAmountBD.doubleValue();
BigDecimal xxxxx = (BigDecimal)rs.getBigDecimal("xxxxx");
Double xxxxx = (actualAmountBD == null) ? 0.0 : actualAmountBD.doubleValue();
dbstore(x, xx, xxx, xxxx, xxxxx, asOf);
}
}