PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come acquisire i record di errore utilizzando JDBCTemplate batchUpdate in postgreSql?

Non ottieni BatchUpdateException , perché potresti usare SQLErrorCodeSQLExceptionTranslator in jdbcTemplate , che gestisce BatchUpdateException s in modo speciale :

if (sqlEx instanceof BatchUpdateException && sqlEx.getNextException() != null) {
    SQLException nestedSqlEx = sqlEx.getNextException();
    if (nestedSqlEx.getErrorCode() > 0 || nestedSqlEx.getSQLState() != null) {
        sqlEx = nestedSqlEx;
    }
}

C'è un problema al riguardo:

Puoi mitigare questo, se usi SQLStateSQLExceptionTranslator :

jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());

Quindi otterrai la BatchUpdateException come cause :

try {
    // ...
} catch (DataAccessException e) {
    Throwable cause = e.getCause();
    logger.info("cause instanceof BatchUpdateException = {}", cause instanceof BatchUpdateException);
 }

Ma nota che in caso di driver jdbc postgresql BatchUpdateException#getUpdateCounts() conterrà EXECUTE_FAILED solo, nonostante alcune righe siano state inserite correttamente.

Vedi questo problema