Массовая вставка MySQL 5.7 со столбцом BLOB - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь выполнить массовую вставку в MySQL, используя

INSERT INTO TABLE (a, b, c) VALUES (?, ?, ?), (?, ?, ?)

У меня есть общий вход в систему, и я вижу, что это прекрасно работает в большинстве случаев.Однако, когда в таблице есть столбец BLOB, он также не работает.

Я пытаюсь вставить 20 записей.

Без BLOB я вижу все 20 записей в одном и том жезапрос в общем журнале, 20 записей вставлено в тот же запрос.

С BLOB я вижу только 2 записи на запрос в общем журнале, всего 10 запросов.

Это проблема с MySQL, драйвером JDBC, или я что-то упустил.Я бы предпочел использовать BLOB, поскольку у меня есть данные в protobufs.

Вот пример таблицы ...

CREATE TABLE my_table (
  id CHAR(36) NOT NULL,
  name VARCHAR(256) NOT NULL,
  data BLOB NOT NULL,
  PRIMARY KEY (id)
);

Затем создайте свои пакетные вставки в коде ...

val ps = conn.prepareStatement(
  "INSERT INTO my_table(id, name, data) VALUES (?, ?, ?)")
records.grouped(1000).foreach { group =>
  group.foreach { r =>
    ps.setString(1, UUID.randomUUID.toString)
    ps.setString(2, r.name)
    ps.setBlob(3, new MariaDbBlob(r.data))
    ps.addBatch()
  }
  ps.executeBatch()
}

Если вы запустите это и просмотрите общий журнал, вы увидите ...

"2018-10-12T18: 37: 55.714825Z 4 Запрос INSERT INTO my_table (id, name,fqdn, data) VALUES ('b4955537-2450-48c4-9953-e27f3a0fc583', '17 -apply-test ', _binary' 17-apply-test \ 'AAAA (? ​​2Pending8 ?????, J $ b4955537-2450-48c4-9953-e27f3a0fc583

1: 2: 3: 4: 5: 6: 7: 8Rsystem '), (' 480e470c-6d85-4bbc-b718-21d9e80ac7f7 ', '18 -применить тест), _binary '18-apply-test \ "AAAA (? ​​2Pending8 ?????, J $ 480e470c-6d85-4bbc-b718-21d9e80ac7f7

1: 2: 3: 4: 5: 6: 7: 8Rsystem ') 2018-10-12T18: 37: 55.715489Z 4 Запрос INSERT INTO my_table (id, name, data) VALUES (' 7571a651-0e0b-4e78-bff0-1394070735ce ', '19 -apply-test', _binary '19-применить-тест \ "AAAA (? ​​2Pending8 ?????, J $ 7571a651-0e0b-4e78-bff0-1394070735ce

1: 2: 3: 4: 5: 6: 7: 8Rsystem '), ('f77ebe28-73d2-4f6b-8fd5-284f0ec2c3f0', '20 -apply-test ', _binary' 20-apply-test \ "AAAA (? ​​2Pending8 ?????, J $ f77ebe28-73d2-4f6b-8fd5-284f0ec2c3f0

Как выМожно видеть, что каждый INSERT INTO имеет только 2 записи.

Теперь, если вы удалите поле data из схемы и вставите и повторно запустите, вы увидите следующий вывод (для10 записей) ...

"2018-10-12T19: 04: 24.406567Z 4 Запрос INSERT INTO my_table (id, name) VALUES ('d323d21e-25ac-40d4-8cff-7ad12f83b8c0', '1-apply-test '), (' f20e37f2-35a4-41e9-8458-de405a44f4d9 ',' 2-apply-test '), (' 498f4e96-4bf1-4d69-a6cb-f0e61575ebb4 ',' 3-apply-test '),('8bf7925d-8f01-494f-8f9f-c5b8c742beae', '4-apply-test'), ('5ea663e7-d9bc-4c9f-a9a2-edbedf3e5415', '5-apply-test'), ('48f535c8-446)4f10-9af9-1562081538e5 ',' 6-apply-test '), (' fbf2661f-3a23-4317-ab1f-96978b39fffe ',' 7-apply-test '), (' 3d781e25-3f30-48fd-b22b-91f0db8ba401 ', '8-apply-test'), ('55ffa950-c941-44dc-a233-ebecfd4413cf', '9-apply-test'), ('6edc6e25-6e70-42b9-8473-6ab68d065d44', '10 -apply-тест ') "

Все 10 записей находятся в одном запросе

1 Ответ

0 голосов
/ 12 октября 2018

Я возился, пока не нашел исправление ...

val ps = conn.prepareStatement(
  "INSERT INTO my_table(id, name, data) VALUES (?, ?, ?)")
records.grouped(1000).foreach { group =>
  group.foreach { r =>
  ps.setString(1, UUID.randomUUID.toString)
  ps.setString(2, r.name)
  //ps.setBlob(3, new MariaDbBlob(r.data))
  ps.setBytes(r.data)
  ps.addBatch()
}
ps.executeBatch()

Использование PreparedStatement.setBytes вместо MariaDbBlob, казалось, помогло

...