PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erfasst man Fehlerdatensätze mit JDBCTemplate batchUpdate in postgreSql?

Sie erhalten keine BatchUpdateException , da Sie möglicherweise SQLErrorCodeSQLExceptionTranslator in jdbcTemplate , der BatchUpdateException behandelt s auf besondere Weise :

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

Es gibt ein Problem:

Sie können dies abschwächen, indem Sie den SQLStateSQLExceptionTranslator :

jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());

Dann erhalten Sie die BatchUpdateException als cause :

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

Aber Beachten Sie, dass im Fall des Postgresql-JDBC-Treibers BatchUpdateException#getUpdateCounts() enthält EXECUTE_FAILED nur, obwohl einige Zeilen erfolgreich eingefügt werden konnten.

Siehe dies Problem