Db.batch(....) 中的参数 batchSize 有些不利于事务控制

ForJustice 发布于 2012/11/15 21:22
阅读 1K+
收藏 0

案例:

在一个事务中 ,我传入1 万条数据用于批处理,设置 batchSize 为 100条,在最后一百条出错了,结果事务回滚,但是回滚的只是最后的一百条数据,前面的9900条已经入库,我也不知道是哪些数据出了错。假设我通过某种途径修正了1万条中错误的数据,这时我想按先前的批处理进行再一次的入库,咋办??? 

所以我觉得batchSize 这个变量应该由使用者自己去定义,不应该作为batch的参数传入。JFinal 的 batch 只需要负责给了多少数据就一次性commit多少数据,每一次批量提交都在一个事务中控制,这次失败了,那就把这次的数据回滚,至于批量提交多少次,那就是使用者自己控制了。 这样的话,使用者就知道哪一批次的数据错了,如果可以的话,可以开启另外的线程异步处理掉这批错误数据,当前线程接着处理下一批次的数据。

加载中
1
a
alvinte

1、基于使用者清楚批量操作的数据量限制的前提下,其实使用者手动分好批次执行batch和指定batchsize参数执行木有太大区别。唯一一点就是如果指定参数程序自动分批次的话,在发生异常的时候可能需要在报告异常的时候,指明是第几个批次失败了,否则就要去check数据才能知道。

2、如果使用者不知道批量操作的数据量限制的话,batchsize参数可能会给使用者带来疑惑。

综上,带有batchsize参数有两点好处:1、省代码,不用自己写循环和其他重复代码。2、强制使用者清楚数据量是批量操作成功与否的因素之一。 当然凡事都是双刃剑,缺点可能就如楼主和上述所述。

建议,是否可以考虑加一批不带batchsize参数的重载,即默认batchsize为Integer.MAX_VALUE?其次,自动分批次如果异常能否提示批次号?

ForJustice
ForJustice
我支持你的建议,哈哈
JFinal
JFinal
使用 Integer.MAX_VALUE是个好主意,下一版考虑做此改变
0
JFinal
JFinal

    这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。

    目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 50000。

0
ForJustice
ForJustice

引用来自“JFinal”的答案

    这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。

    目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。

额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。

0
JFinal
JFinal

引用来自“Mr.Over”的答案

引用来自“JFinal”的答案

    这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。

    目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。

额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。

哪天把你的需求详细发起个问答,我看看有什么更好的方案 :)
0
Ryan-瑞恩
Ryan-瑞恩
每次做个提交。。。并记录回滚的
返回顶部
顶部