#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 )