我正在尝试使用
向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条记录都在同一查询中
答案 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
似乎可以解决问题