programing

MySQL 5.7 벌크 삽입(BLOB 열 포함)

javaba 2022. 9. 23. 23:16
반응형

MySQL 5.7 벌크 삽입(BLOB 열 포함)

를 사용하여 MySQL에 대량 삽입을 시도하고 있습니다.

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

일반 로그온을 했는데, 대부분의 경우 이 기능이 훌륭하게 작동한다는 것을 알 수 있습니다.그러나 테이블에 BLOB 열이 있는 경우 이 열도 작동하지 않습니다.

20개의 레코드를 삽입하려고 합니다.

BLOB를 사용하지 않으면 일반 로그에서 동일한 쿼리에 있는 20개의 레코드가 모두 표시되고 동일한 쿼리에 삽입된 20개의 레코드가 표시됩니다.

BLOB를 사용하면 일반 로그에는 쿼리당 레코드가 2개밖에 표시되지 않으므로 총 10개의 쿼리가 필요합니다.

이것은 MySQL, JDBC 드라이버의 문제입니까?아니면 다른 것을 찾을 수 없는 건가요?protobufs에 데이터가 있기 때문에 BLOB를 사용하고 싶습니다.

여기 예시표가 있습니다...

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.714825Z 4 쿼리 INSERT INTO my_table(ID, 이름, fqdn, 데이터) 값('b49555537-48c4-9953-e27f3a0fc583', _binary 17-apply-test')AAAA(?2 Pending 8 ?----, J$b49555537-2450-48c4-9953-e27f3a0fc583)

1:2:3:4:5:7:8R시스템', '480e470c-6d85-4bbc-b718-21d9e80ac7f7', '18-apply-test', _binary '18-apply-test'AAAA(?2 Pending 8 ?----, J$480e470c-6d85-4bc-b718-21d9e80ac7f7

1:2:3:4:5:7:8Rsystem) 2018-10-12T18:37:55.715489Z 4 쿼리 INSERT IN my_table(ID, 이름, 데이터) VALUES(7571a651-0e0b-478-bff0-1394070735ce, '19-apperiary',AAAA(?2Pending8?----, J$7571a651-0e0b-4e78-bff0-1394070735ce

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

보시다시피 각 INSERT INTO에는 2개의 레코드만 있습니다.

이제, 이 명령어를 삭제하면,data스키마에서 필드를 열고 삽입 후 다시 실행하면 다음 출력이 표시됩니다(10개 레코드의 경우).

"2018-10-12T19:04:24.406567Z 4 쿼리 INSERT INTO my_table(id, name) 값('d323d21e-25ac-40d4-8cff-7ad12f83b8c0', '1-apply-test'), 'f20e37f2-354-354-45a-445'-f535c8-44e6-4f10-9f2081538e5', '6-flash-test', 'fbf2661f-3a23-4317-ab1f-96978b39fe', '7-flash-test', '3d781e25-3f-f-22b'

10개의 모든 레코드가 동일한 쿼리에 있습니다.

해결책을 찾을 때까지 계속 고민했는데...

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인 것

언급URL : https://stackoverflow.com/questions/52785123/mysql-5-7-bulk-insert-with-blob-column

반응형