我正在处理Spring的JdbcTemplate,并具有以下代码,该代码以收集的值一个一个地更新数据库。当我检查它花费大量时间来更新20,000条记录和不良设计时。
我正在寻求实施 batchUpdate (如果可能的话,这可能是更好的方法),以便一次更新数据库。我们如何实现这一目标?在这里,我正在List<Map<String, Object>>
中获取数据。
我通过以下链接:
下面的错误
private static final String sql =
"INSERT INTO ACCT_LIMIT (ACCT_LIMIT_ID, PRNT_ACC_NUM, ACC_NUM, BILL_YR, CRTE_USER_ID, CRTE_DT) "
+ "select HDFC_ACC_ID_SEQ.nextval, ?, ?, ?, ?, sysdate from dual "
+ " where not exists(select * from ACCT_LIMIT where (PRNT_ACC_NUM = ? and ACC_NUM = ? and BILL_YR = ?))";
for (Map<String, Object> m : childParentMapList) {
BigDecimal accData = (BigDecimal) m.get("ACC_NUM");
BigDecimal parentAcc = (BigDecimal) m.get("PARENT_ACC_ID");
List<Map<String, Object>> accntCount = jdbcTemplate.queryForList(another_SQL, parentAcc);
Long accCount = getaccCount(accntCount);
if (accCount < 3) {
Object[] args = new Object[] { parentAcc, accData, LocalDate.now().getYear(), JOB_NAME,
parentAcc, accData, LocalDate.now().getYear() };
int[] argTypes = new int[] { Types.NUMERIC, Types.NUMERIC, Types.VARCHAR, Types.VARCHAR, Types.NUMERIC,
Types.NUMERIC, Types.VARCHAR };
int rowsUpdated = jdbcTemplate.update(sql, args, argTypes);
logger.info("getBillableICAList | Rows Updated : "+rowsUpdated);
if (rowsUpdated == 1) {
// return list of String
billableaccDataList.add(accData.toString());
}
}
}
有人可以指导我如何做吗?
for (Map<String, Object> map : childParentMapList) {
Integer count = (Integer) map.get("count");
if(count < 3) {
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public int getBatchSize() {
// TODO Auto-generated method stub
return 0;
}
});
// TODO - Here I need count if that single instance of record gets update and create new String to return ?
}
}