/ / Obsługa błędów Spring JdbcTemplate batchUpdate - wiosna, obsługa błędów, wiosna-jdbc, jdbctemplate

Obsługa błędów Spring JdbcTemplate batchUpdate - wiosna, obsługa błędów, wiosna-jdbc, jdbctemplate

Próbuję zaktualizować tysiące wierszy w tabela przy użyciu batchUpdate. Moje wymagania to:

1) Załóżmy, że w partii jest 1000 rekordów. Rekord nr 235 spowodował błąd. Jak mogę się dowiedzieć, który rekord spowodował błąd.

2) Załóżmy, że rekord 600 nie spowodował aktualizacji (przyczyną może być brak rekordu pasującego do klauzuli where). Jak mogę znaleźć zapisy, które nie doprowadziły do ​​aktualizacji.

3) W obu scenariuszach powyżej, jak mogę kontynuować przetwarzanie pozostałych rekordów.

Odpowiedzi:

2 dla odpowiedzi № 1

Jedynym rozwiązaniem po długich poszukiwaniach i debugowaniu jest przejście do klasy BatchUpdateException i znalezienie ujemnego elementu oraz wywnioskowanie wartości wstawienia, która jest błędna z MAP.

import java.sql.BatchUpdateException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;


import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;


@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Repository("dao_")
public class YouDao extends CommunDao implements IyouDao {

public void bulkInsert(final List<Map<String, String>> map)
throws BusinessException {
try {

String sql = " insert into  your_table " + "(  aa,bb  )"
+ "values " + "(  ?,? )";
BatchPreparedStatementSetter batchPreparedStatementSetter = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {
Map<String, String> bean = map.get(i);

ps.setString(1, bean.get("aa"));
ps.setString(2, bean.get("bb"));
//..
//..

}

@Override
public int getBatchSize() {
return map.size();
}
};

getJdbcTemplate().batchUpdate(sql, batchPreparedStatementSetter);

}

catch (Exception e) {
if (e.getCause() instanceof BatchUpdateException) {
BatchUpdateException be = (BatchUpdateException) e.getCause();
int[] batchRes = be.getUpdateCounts();
if (batchRes != null && batchRes.length > 0) {
for (int index = 0; index < batchRes.length; index++) {
if (batchRes[index] == Statement.EXECUTE_FAILED) {
logger.error("Error execution >>>>>>>>>>>"
+ index + " --- , codeFail : " + batchRes[index]
+ "---, line " + map.get(index));
}
}
}
}
throw new BusinessException(e);
}

}

}

-2 dla odpowiedzi nr 2

int [] rows = jdbcTemplate.batchUpdate (TbCareQueryConstant.SQL_UPDATE_BANKDETAILS_OF_USER, new BatchPreparedStatementSe tter () {

..... Twój kod

}

for (int i = 0; i <rows.length; i ++) {

     if(rows[i] == 0){


}
}