带BLOB列的MySQL 5.7批量插入

时间:2018-10-12 18:22:38

标签: mysql jdbc insert mariadb

我正在尝试使用

向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查询插入到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-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查询插入到my_table(id,名称,数据)值('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查询插入到my_table(id,name)值('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-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-test')”

所有10条记录都在同一查询中

1 个答案:

答案 0 :(得分:0)

我修补,直到找到解决办法...

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似乎可以解决问题