gpt4 book ai didi

java - BatchUpdateException updateCounts 始终为 1

转载 作者:行者123 更新时间:2023-11-29 12:20:56 26 4
gpt4 key购买 nike

我正在使用 Postgres 9.3、Spring 和 Java。

对于来自 javadoc 的 BatchUpdateException:

After a command in a batch update fails to execute properly and a BatchUpdateException is thrown, the driver may or may not continue to process the remaining commands in the batch. If the driver continues processing after a failure, the array returned by the method BatchUpdateException.getUpdateCounts will have an element for every command in the batch rather than only elements for the commands that executed successfully before the error. In the case where the driver continues processing commands, the array element for any command that failed is Statement.EXECUTE_FAILED.

我在jdbcTemplate中注册了下面的翻译器

public class DuplicateRecordSQLErrorCodesTranslator extends SQLErrorCodeSQLExceptionTranslator {

@Override
protected DataAccessException doTranslate(String task, String sql, SQLException ex) {
String errorCode = ex.getErrorCode() == 0 ? ex.getSQLState() : String.valueOf(ex.getErrorCode());

if (ex instanceof BatchUpdateException) {
int[] updatesCount = ((BatchUpdateException) ex).getUpdateCounts();

然后在场景中,我尝试将一批插入到包含 100 个条目的数据库中,但其中有 50 个是重复的。最终我无法在第一笔交易中检索所有重复的条目,因为返回的 updateCounts 始终为 1。

最佳答案

目前还不清楚您到底想要什么。 PostgreSQL Documentation显示了如何编写 PL/pgSQL 函数的示例,该函数根据主键是否已存在进行更新或插入。

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
LOOP
-- first try to update the key
UPDATE db SET b = data WHERE a = key;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO db(a,b) VALUES (key, data);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- Do nothing, and loop to try the UPDATE again.
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;

SELECT merge_db(1, 'david');
SELECT merge_db(1, 'dennis');

因此在您的情况下,您可以使用此函数或对其进行修改以满足您的需要,然后进行批量函数调用。这是我能想到的在 PostgreSQL 中做您想做的最有效的方法。 (其他数据库有 SQL 扩展,可以更直接地处理这个问题。)

相反,如果您希望插入在重复的键上失败,并且只想知道哪个成功,哪个失败,您可以重写函数以返回成功或失败 boolean 值,或者在成功时返回 null,在失败时返回键 ID。

关于java - BatchUpdateException updateCounts 始终为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24776129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com