Postgresql executeBatch не работает после следования руководству mkyong - PullRequest
1 голос
/ 06 июля 2019

Я пытаюсь переписать +/- 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);
            }
        }
    }

Ожидаемый результат будет +/- 250 операторов вставки в 1 вызове, он попытается вставить все строки, даже если PK выдает ошибку на 1 из них.

1 Ответ

0 голосов
/ 07 июля 2019

На самом деле это работало, я просто никогда не замечал ошибку, потому что я отфильтровал ее без каких-либо уведомлений (глупо)

также изменил запрос на: String insertTableSQL = "INSERT INTO RANK (учетная запись, ранг, дата) ЗНАЧЕНИЯ (?,?, To_timestamp (?, 'YYYY-MM-DD \" T \ "HH24: MI: SS.ff3 \" Z \ "')) ПО КОНФЛИКТУ НИЧЕГО НЕ ДЕЛАЕТ "; чтобы не было ошибки первого дубликата с ПК ...

...