PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como capturar registros de erro usando JDBCTemplate batchUpdate no postgreSql?


Você não recebe BatchUpdateException , porque você pode usar SQLErrorCodeSQLExceptionTranslator em jdbcTemplate , que lida com BatchUpdateException s de uma maneira especial :
if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
    SQLException nestedSqlEx = sqlEx.getNextException();
    if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
        sqlEx = nestedSqlEx;
    }
}

Há uma questão sobre isso:

Você pode atenuar isso se usar o SQLStateSQLExceptionTranslator :
jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());

Então você receberá o BatchUpdateException como uma cause :
try {
    // ...
} catch (DataAccessException e) {
    Throwable cause = e.getCause();
    logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
 }

Mas note que no caso do driver jdbc postgresql BatchUpdateException#getUpdateCounts() conterá EXECUTE_FAILED apenas, apesar do fato de que alguma linha pode ser inserida com sucesso.

Veja este questão