mysql 5.7带blob列的大容量插入

2exbekwf  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(344)

我正在尝试使用

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

我有一个通用的登录,看到这在大多数情况下都非常有效。但是,当表有blob列时,它就不能正常工作。
我想插入20张唱片。
如果没有blob,我会在常规日志中看到同一查询中的所有20条记录,在同一查询中插入20条记录。
对于blob,我在常规日志中每个查询只能看到2条记录,总共需要10个查询。
这是jdbc驱动程序mysql的问题,还是我遗漏了什么。我更喜欢使用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 query insert into my \u table(id,name,fqdn,data)values('B495537-2450-48c4-9953-e27f3a0fc583','17 apply test','17 apply test\”aaaa(?2pending8?????,j$b4955537-2450-48c4-9953-e27f3a0fc583
1:2:3:4:5:6:7:8r系统',('480e470c-6d85-4bbc-b718-21d9e80ac7f7','18应用测试','u二进制'18应用测试\“aaaa(?2pending8?????,j$480e470c-6d85-4bbc-b718-21d9e80ac7f7
1:2:3:4:5:6:7:8rsystem')2018-10-12t18:37:55.715489z 4 query insert into my \u table(id,name,data)values('7571a651-0e0b-4e78-bff0-1394070735ce','19 apply test','19 apply test','19 apply test\“aaaa(?2pending8?????),j$7571a651-0e0b-4e78-bff0-1394070735ce
1:2:3:4:5:6:7:8r系统',('f77ebe28-73d2-4f6b-8fd5-284f0ec2c3f0','20应用测试','u二进制'20应用测试\“aaaa(?2pending8?????,j$f77ebe28-73d2-4f6b-8fd5-284f0ec2c3f0
如您所见,每个insert-into中只有2条记录。
现在,如果你把 data 字段,然后插入并重新运行,您将看到以下输出(对于10条记录)。。。
2018-10-10-12 t19:04:24.40654067674查询插入到我的查询表(id,name)的值('d23d21e-25ac-40d4-8cff-7ad40d4-8ff-102018-10-10-12-12 t19:04:04:24.406567z查询插入到我的查询插入到我的查询表(id,name)的表(id,name)的值('d23d23d2e-251e-25ac-25ac-40d4-8cff-7f-7adf-7ad4f-7adf-7adf-7ad12fff7f-7f-7ad12f7f7f-7f-7f7f-7f-7f-4f-4f-8f-c5f-c5f4f-5f-c5f4f-c5f4f-c5f9f-c5f4f 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条记录都在同一个查询中

xzabzqsa

xzabzqsa1#

我修修补补直到找到解决办法。。。

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 似乎成功了

相关问题