遵循mkyong指南后,postgresql executeBatch不起作用

时间:2019-07-06 13:07:30

标签: java postgresql prepared-statement try-with-resources

我正在尝试将+/- 250个单独的插入语句重写为1个批处理语句,但是它什么也没做。没有错误,没有回应

已遵循本指南: https://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

此后,很多堆栈溢出,但我看不到问题

我的本​​地数据库:

    <Resource name="jdbc/wtnfV2local" url="jdbc:postgresql://localhost:5432/wtnfV2local"
        driverClassName="org.postgresql.Driver" auth="Container" type="javax.sql.DataSource"
        username="postgres" password="geheim" />

我的无效代码:

    @Override
    public void insertArrayUserV2Voidv2(ArrayList<UserV2> users) {
        String insertTableSQL = "INSERT INTO RANK (account, rank, date) VALUES (?,?, to_timestamp(?, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff3\"Z\"'))";
            try (Connection conn = baseDao.getConnection();
                    PreparedStatement preparedStmt = conn.prepareStatement(insertTableSQL);) {

                for (UserV2 u : users) {
                preparedStmt.setString(1, u.getAccount());
                preparedStmt.setString(2, u.getRank());
                preparedStmt.setString(3, u.getJoined());
                preparedStmt.addBatch();
                System.out.println(preparedStmt);
                }

                System.out.println(conn.getClientInfo());
                preparedStmt.executeBatch();
            } catch (SQLException e) {
                if (e.getErrorCode() == 0) {
                } else
                    throw new WebApplicationException(e.getMessage(), Response.Status.CONFLICT);
            }
    }

和我以前的工作代码:

    @Override
    public void insertArrayUserV2Void(ArrayList<UserV2> users) {
        String insertTableSQL = "INSERT INTO RANK (account, rank, date) VALUES (?,?, to_timestamp(?, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff3\"Z\"'))";
        for (UserV2 u : users) {
            try (Connection conn = baseDao.getConnection();
                    PreparedStatement preparedStmt = conn.prepareStatement(insertTableSQL);) {
                preparedStmt.setString(1, u.getAccount());
                preparedStmt.setString(2, u.getRank());
                preparedStmt.setString(3, u.getJoined());
                preparedStmt.execute();
            } catch (SQLException e) {
                if (e.getErrorCode() == 0) {
                } else
                    throw new WebApplicationException(e.getMessage(), Response.Status.CONFLICT);
            }
        }
    }

预期结果将是在1次调用中出现+/- 250条插入语句,即使PK对其中1条抛出错误,该语句也会尝试插入所有行。

1 个答案:

答案 0 :(得分:0)

实际上它正在工作,我只是从未注意到错误原因,因为我没有任何通知就将其过滤掉了(愚蠢的我)

还将查询更改为: 字符串insertTableSQL =“将行插入(帐户,排名,日期)值(?,?,to_timestamp(?,'YYYY-MM-DD \” T \“ HH24:MI:SS.ff3 \” Z \“'))在冲突中不要“;这样就不会在PK的第一个重复项上引发错误...