Db.batch(....) 中的参数 batchSize 有些不利于事务控制? 400 报错
案例:
在一个事务中 ,我传入1 万条数据用于批处理,设置 batchSize 为 100条,在最后一百条出错了,结果事务回滚,但是回滚的只是最后的一百条数据,前面的9900条已经入库,我也不知道是哪些数据出了错。假设我通过某种途径修正了1万条中错误的数据,这时我想按先前的批处理进行再一次的入库,咋办???
所以我觉得batchSize 这个变量应该由使用者自己去定义,不应该作为batch的参数传入。JFinal 的 batch 只需要负责给了多少数据就一次性commit多少数据,每一次批量提交都在一个事务中控制,这次失败了,那就把这次的数据回滚,至于批量提交多少次,那就是使用者自己控制了。 这样的话,使用者就知道哪一批次的数据错了,如果可以的话,可以开启另外的线程异步处理掉这批错误数据,当前线程接着处理下一批次的数据。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
1、基于使用者清楚批量操作的数据量限制的前提下,其实使用者手动分好批次执行batch和指定batchsize参数执行木有太大区别。唯一一点就是如果指定参数程序自动分批次的话,在发生异常的时候可能需要在报告异常的时候,指明是第几个批次失败了,否则就要去check数据才能知道。
2、如果使用者不知道批量操作的数据量限制的话,batchsize参数可能会给使用者带来疑惑。
综上,带有batchsize参数有两点好处:1、省代码,不用自己写循环和其他重复代码。2、强制使用者清楚数据量是批量操作成功与否的因素之一。 当然凡事都是双刃剑,缺点可能就如楼主和上述所述。
建议,是否可以考虑加一批不带batchsize参数的重载,即默认batchsize为Integer.MAX_VALUE?其次,自动分批次如果异常能否提示批次号?
######我支持你的建议,哈哈######使用 Integer.MAX_VALUE是个好主意,下一版考虑做此改变######这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。
目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 50000。
######这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。
目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。
额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。
这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。
目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。
额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。