关于 Db类中的批处理batch操作

ForJustice 发布于 2012/11/07 23:22
阅读 2K+
收藏 0

@JFinal 波哥你好,我有个小小的建议,希望能考虑一下,是关于 Db类中的批处理batch操作的。

从我个人而言,我使用最多就是读取文件的中的数据,进行批量入库 (oracle数据库),其中有个问题就是当我们更新或删除不存在的数据时,数据库并不会报错,但是为了保证数据能够尽可能的入库,我就必须要知道当前批量操作到底成功了多少条,把未能成功update的数据,再次进行insert操作。而根据jfinal的 Db 类 对batch的封装,原汁原味的返回了一个int类型的数组,但是我个人觉得这个数组中的数据并无多大意义,特别地,不能统计出当前批处理操作到底成功了多少条,而通过PreparedStatement 对象的 getUpdateCount()方法却能获得每次批量提交时对数据库真实的影响条数(即 成功了多少条)。

So I have a dream ,我希望JFinal的Db类能够通过某种途径,返回批量操作对数据库的真实影响条数.

加载中
0
JFinal
JFinal
    我会好好思考这个问题,看是否能把此功能在下一版本实现,或许传个int[] updateCount参数进去就可以  
0
JFinal
JFinal

    测试了一下PreparedStatement 对象的 getUpdateCount()方法只能得到最后一条sql的更新数量,所以当addBatch(...)超过一条时getUpdateCount()得到的数据没有意义了。

    要得到更新总数需要对目前int[] 返回值做个累加。所以目前能想到的解决方案:

1:改变返回值,将 int[] 进行累加并返回 long

2:添加 long[]  updateCount形参,将累加值存入此变量

如果采用方案一,那么开发者万一要去拿int[]就不方便了。或许可以采用方案二,但如果保持现状,开发者可以通过一个简单的循环达到此目的:

int[] result = Db.batch(...);
long updateCounter = 0;
for (int i : result)
  updateCount += i;

是否要要用添加 long[] updateCounter需要再权衡一下,主要为是考虑简洁 :)

0
ForJustice
ForJustice

引用来自“JFinal”的答案

    测试了一下PreparedStatement 对象的 getUpdateCount()方法只能得到最后一条sql的更新数量,所以当addBatch(...)超过一条时getUpdateCount()得到的数据没有意义了。

    要得到更新总数需要对目前int[] 返回值做个累加。所以目前能想到的解决方案:

1:改变返回值,将 int[] 进行累加并返回 long

2:添加 long[]  updateCount形参,将累加值存入此变量

如果采用方案一,那么开发者万一要去拿int[]就不方便了。或许可以采用方案二,但如果保持现状,开发者可以通过一个简单的循环达到此目的:

int[] result = Db.batch(...);
long updateCounter = 0;
for (int i : result)
  updateCount += i;

是否要要用添加 long[] updateCounter需要再权衡一下,主要为是考虑简洁 :)

这个对于oracle是不对的,oracle对executeBatch并不完全支持,总是返回-2 ,所以不能用累加
ForJustice
ForJustice
回复 @JFinal : 成功时肯定返回 1 ,不成功也不抛错时就是负数了,还真不一定是 -2
JFinal
JFinal
oracle 下如何在 executeBatch() 后得到 updateCounter? 如果老返回 -2,这个功能貌似不好实现了 :)
0
ForJustice
ForJustice
因为我用的最多是针对单挑sql + batch , 所以用  getUpdateCount() 获取每次执行的返回值,再进行累加,没考虑到多条sql的情况。 看来针对 oracle又要搞个特殊情况了!!
JFinal
JFinal
多条的确是不方便了,你那要有有好方案,记得分享一下 :)
返回顶部
顶部