PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment capturer les enregistrements d'erreur à l'aide de JDBCTemplate batchUpdate dans postgreSql ?

Vous n'obtenez pas BatchUpdateException , car vous pourriez utiliser SQLErrorCodeSQLExceptionTranslator dans jdbcTemplate , qui gère BatchUpdateException s d'une manière spéciale :

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

Il y a un problème à ce sujet :

Vous pouvez atténuer cela, si vous utilisez le SQLStateSQLExceptionTranslator :

jdbcTemplate.setExceptionTranslator(new SQLStateSQLExceptionTranslator());

Ensuite, vous obtiendrez le BatchUpdateException comme cause :

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

Mais notez qu'en cas de pilote jdbc postgresql BatchUpdateException#getUpdateCounts() contiendra EXECUTE_FAILED seulement, malgré le fait que certaines lignes ont pu être insérées avec succès.

Voir ceci problème