簡體   English   中英

帶BLOB列的MySQL 5.7批量插入

[英]MySQL 5.7 bulk insert with BLOB column

我正在嘗試使用以下方式將大量插入MySQL

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

我已經登錄完畢,可以看到在大多數情況下這種方法都非常出色。 但是,當表具有BLOB列時,它也將無法正常工作。

我正在嘗試插入20條記錄。

如果沒有BLOB,我會在常規日志中的同一查詢中看到所有20條記錄,在同一查詢中插入了20條記錄。

使用BLOB時,我在常規日志中每個查詢只看到2條記錄,總共需要10條查詢。

這是MySQL,JDBC驅動程序的問題,還是我缺少其他功能。 我更喜歡使用BLOB,因為我在protobuf中有數據。

這是一個示例表...

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測試\\“AAAA(?2Pending8 ?????,J $ b4955537-2450-48c4-9953,e27f3a0fc583

1:2:3:4:5:6:7:8Rsystem'),('480e470c-6d85-4bbc-b718-21d9e80ac7f7','18-apply-test',_ 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-apply-test \\“ 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-44e6-4f10-9af9-1562081538e5','6-apply-測試''),('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-test')”

所有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似乎可以解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM