Vert.x — Сохранение порядка строк при массовой вставке с использованием драйвера JDBC

#java #sql-server #vert.x

#java #sql-сервер #vert.x

Вопрос:

Я пытаюсь выполнить массовую вставку в базу данных MSSQL с использованием vertx java, и по какой-то причине вставка не выполняется в таблице в том же порядке, в котором я размещаю данные в списке. Для моей бизнес-логики очень важно иметь этот порядок в базе данных.В консоли он показывает порядок правильно, но когда я просматриваю его в базе данных, порядок полностью перепутан.

 public void insertChildUid(SortedSet<String> goodReadSet, Integer serialID) {
        LOG.debug(" serialID " serialID);
        List<JsonArray> batch = new ArrayList<JsonArray>();
        
        int childSetSize = goodReadSet.size();
        LOG.debug(" childSetSize " childSetSize);
        String[] goodReadArray = new String[childSetSize];
        goodReadArray = goodReadSet.toArray(goodReadArray);
        
        for (int i=0; i < childSetSize; i  ) {
            String[] puidAndUid = new String[1];            
            puidAndUid = goodReadArray[i].split(":");
            String puid = puidAndUid[0];
            String uid = puidAndUid[1];

            batch.add(new JsonArray().add(uid).add(puid).add(serialID));
        }
        String sql = "INSERT INTO serial"
                          " (uid, fnc, serialorderid)"
                          " VALUES(?, ?, ?) ";
        
        LOG.debug("SQL QUERY :" formatQuery(sql, batch));
        
        dbClient.getConnection(conn->{
            if(conn.failed()){
                LOG.error("Can't get Vertx connection",conn.cause());
            } else{
                LOG.debug(" Vertx connected for BATCH INSERT!!!!!!!!!");
                
                final SQLConnection connection = conn.result();                          
                connection.batchWithParams(sql,batch,(AsyncResult<List<Integer>> res) -> {
                  if (res.succeeded()) {
                        List<Integer> result = res.result();
                        LOG.debug("result : " result.size());
                        //LOG.debug("BATCH INSERT COMPLETE!!!!!!!!!");
                        LOG.debug(" BATCH INSERT COMPLETE FOR PUID!!!!!!!!! " batch.get(0).getString(1));
                      } else {
                        // Failed!
                          LOG.debug("Failed! : " res.cause());
                      }
                    });
                connection.close();
            }
        });
        
    }   
  

Ниже приведен мой вывод на консоль

*

11:41:04.569 [vert.x-eventloop-thread-1] ОТЛАЖИВАТЬ tntmanual.server.dao.SerialOrderDAO — Дочерний размер 10

11:41:04.570 [vert.x-eventloop-thread-1] ОТЛАДИТЬ ЗАПРОС tntmanual.server.dao.SerialOrderDAO — SQL: ВСТАВИТЬ В последовательные (uid, fnc, serialorderid) ЗНАЧЕНИЯ([[«11980005339800793304″,»11980180231000164186»,72], [«11980013237900080767″,»11980180231000164186»,72], [«11980018018100688258″,»11980180231000164186»,72], [«11980018208300933667″,»11980180231000164186»,72], [«11980018213800239089″,»11980180231000164186»,72], [«11980018531200237597″,»11980180231000164186»,72], [«11980023406000938288″,»11980180231000164186»,72], [«11980027390300806466″,»11980180231000164186»,72], [«11980028239900198090″,»11980180231000164186»,72], [«11980028320100716616″,»11980180231000164186»,72]], {1}, {2})

$$$$$$$$ 11980183084300807471 $$$$$$$$$$$

11:41:04.571 [vert.x-eventloop-thread-1] ОТЛАЖИВАТЬ tntmanual.server.dao.OrderDAO — arraySize 5

11:41:04.572 [vert.x-eventloop-thread-1] ОТЛАЖИВАТЬ tntmanual.server.dao.OrderDAO — arraySize childCounter 1510, перебирающий set: 5 CONSTR SerialOrderDAO!!

11:41:04.572 [vert.x-eventloop-thread-1] ОТЛАЖИВАТЬ tntmanual.server.dao.SerialOrderDAO — serialID 72

11:41:04.572 [vert.x-eventloop-thread-1] ОТЛАЖИВАТЬ tntmanual.server.dao.SerialOrderDAO — childSetSize 5

11:41:04.572 [vert.x-eventloop-thread-1] ОТЛАДИТЬ ЗАПРОС tntmanual.server.dao.SerialOrderDAO — SQL: ВСТАВИТЬ В последовательные (uid, fnc, serialorderid) ЗНАЧЕНИЯ([[«11980053655800913678″,»11980183084300807471»,72], [«11980080273700614629″,»11980183084300807471»,72], [«11980082028600001574″,»11980183084300807471»,72], [«11980082222200939079″,»11980183084300807471»,72], [«11980088238100084516″,»11980183084300807471»,72]], {1}, {2})

11:41:04.572 [vert.x-eventloop-thread-1] ОТЛАДКА tntmanual.server.dao.OrderDAO — сериалы создаются и сохраняются в базе данных

11:41:04.573 [vert.x-eventloop-thread-1] ОТЛАДИТЬ tntmanual.server.dao.SerialOrderDAO — Vertx, подключенный для ПАКЕТНОЙ ВСТАВКИ!!!!!!!!!

11:41:04.576 [vert.x-eventloop-thread-1] ОТЛАДИТЬ tntmanual.server.dao.SerialOrderDAO — Vertx, подключенный для ПАКЕТНОЙ ВСТАВКИ!!!!!!!!!

11:41:04.585 [vert.x-eventloop-thread-1] ОТЛАДКА tntmanual.server.dao.SerialOrderDAO — результат: 5

11:41:04.585 [vert.x-eventloop-thread-1] ОТЛАДКА tntmanual.server.dao.SerialOrderDAO — ПАКЕТНАЯ ВСТАВКА ЗАВЕРШЕНА ДЛЯ PUID!!!!!!!!! 11980183084300807471

11:41:04.585 [vert.x-eventloop-thread-1] ОТЛАДКА tntmanual.server.dao.SerialOrderDAO — результат: 10

11:41:04.585 [vert.x-eventloop-thread-1] ОТЛАДКА tntmanual.server.dao.SerialOrderDAO — ПАКЕТНАЯ ВСТАВКА ЗАВЕРШЕНА ДЛЯ PUID!!!!!!!!! 11980180231000164186*

[![вывод таблицы в базе данных][1]][1] [1]: https://i.stack.imgur.com/YJ49U.gif

Комментарии:

1. Точно определите, что вы имеете в виду, говоря «просмотреть в базе данных порядок, в котором все перепутано». Строки в таблице по определению не имеют определенного порядка. Если вам нужен упорядоченный набор, запрос, который его генерирует, должен включать предложение order by . Если порядок вставки важен, то ваша схема должна включать столбцы, необходимые для этой цели, и что-то (вероятно, ваш код) должно правильно заполнить его.

2. Я имею в виду, что сначала смотрите мой вывод на консоль, сначала он показывает вставку для fnc = 11980180231000164186, размер 10, а затем вставляет fnc = 11980183084300807471, размер 5, но в базе данных он не вставлен в том же порядке, т. Е. Сначала все 10 fnc с 11980180231000164186, затем 5 fnc с 11980183084300807471

3. моя таблица DDL выглядит следующим образом CREATE TABLE serial ( id bigint NOT NULL IDENTITY(1,1), uid nvarchar(20), fnc nvarchar(56), serialorderid bigint NOT NULL, CONSTRAINT PK__serial__3213E83F843DE058 PRIMARY KEY (id), CONSTRAINT FK__serial__serialor__3A81B327 FOREIGN KEY (serialorderid) REFERENCES tntmanual.dbo.serialorder(id) ON DELETE RESTRICT ON UPDATE RESTRICT )