Jfinal Db.batchSave批量存储问题

Jfinal Db.batchSave(List<? extends Model> modelList, int batchSize)

这里有个bug,批量保存的modeList中,如果对象的属性个数不一致只按最少的属性保存,例如这个modelList中是User对象,有十个,其中有一个user有address属性,而其他对象没有设置这个属性,那这一个user的address虽然被设置了值,但存不进数据库里,数据库里这一个user的记录address会是null,如果保存的modellist只有这一个user则可以保存成功


评论区

JFinal

2017-03-23 11:13

List model 中 model 属性个数不相同时,以该 list 中的第一条为准去生成 sql,因为 Db.batchSave(...) 方法的工作原理只能使用一条 sql,而不是多条 sql,那么针对所有的 model 只能选择一条 sql 的最简单的办法就是选择第一个 model 生成 sql

这个不是 bug,是 jdbc 的 batch save 实现只支持一条 sql,解决办法有两个:
1:让 List 的第一个 model 中的属性最多
2:使用别的 Db.batch 支持多 sql 的方法,我记得是 有一个 List sql 的方法

zhouzhou88

2017-03-23 11:45

@JFinal 好的,谢谢。

godhellsing

2017-08-04 10:13

@JFinal 麻烦问下,JFinal中,导入EXL文件中的数据,大部分都是用Db.batch吗?

JFinal

2017-08-04 11:58

@godhellsing 我自己并没有这方面经验,这类功能都是小伙伴们自己扩展的

godhellsing

2017-08-04 12:01

@JFinal 哦哦,感谢回复~

lyleluo

2017-09-13 18:23

Jfinal Db.batchSave(tableName,List modelList, int batchSize) 发现半天没有反应,大概五千数据@JFinal

lyleluo

2017-09-13 18:24

@lyleluo 5W数据,说错了

JFinal

2017-09-14 00:22

@lyleluo 半天没反应,数据是否有部分存进去? 将 batchSize 设置小点,如 3000 试试

heartzeus

2017-09-21 12:49

您好,我测试了9w条数据,平均每batch 1000条需要4.5秒,感觉不太正常。

jfinal初识

2019-08-28 16:14

@JFinal 波总,这个bug可以修复吗,我存一百个,一个对象的name没值,其他99个对象的name有值,应该要能保存的,否则就失去了批量保存的意义了。

JFinal

2019-08-28 16:19

@jfinal初识 这个不是 bug, jfinal 做这个功能的时候就是这么来设计的

你可以通过继承 DbPro 来覆盖这个 batch 方法,改成自己需要的逻辑,假定你的扩展类是 MyDbPro,扩展完以后配置一下即可使用:
activeRecordPlugin.setDbProFactory(new DbProFactory() {
public DbPro getDbPro() {
return new MyDbPro());
}
}

记得搞定后回来分享一下

JFinal

2019-08-28 17:04

@jfinal初识 我还是直接说结果吧,你的这个需求不可能实现,原因如下:
1:batch 批量的基本出发点是: 一条 sql + 多组数据 一起提交到数据库进行操作

2:也就是说,一条 sql 要能被多组数据 "共用"

3:如果不能共用,那就是多条 sql + 多组数据,这种情况就不是 batch 操作了,而是与 for 循环一条一条 sql 去执行没有区别

4:也就是说, batch 操作要么是一条 sql 搞定所有数据,要么就不是 batch 操作


具体到你的需求,其中的那么 sql 大致是:
insert into (...) values ( ?, ?, ? )

假定上面的 sql 是三个问号占位符,假定你的数据前一万条都正好是三个参数,而第 10001 条数据只有两个参数,假定少了一个 name 字段的参数值

此时,JDBC 约定的同一条 sql 适用于多组数据,这个基本点就不成立了

说到底,是 JDBC 不支持,不是 jfinal 不支持

JDBC 要是真去支持,那就不是 batch 了

无涯

2019-09-30 10:50

@heartzeus 我插1000条差不多用了30秒 我怀疑我网络了

无涯

2019-09-30 11:18

jdbc.url=xxx?rewriteBatchedStatements=true

blue111111

2019-12-26 09:07

batchSave批量上传超时是什么原因