日期:2014-05-16  浏览次数:20864 次

PreparedStatement 批量执行有遗漏么?
表里大概有12.W数据
每1W条取一次出来
Java code
"select * from (select t.* ,rownum  row_num  from PAY_PREPAYMENT_WT_SEND t where REMAIN_MONTH <> 0 order by id desc) a where a.row_num>"
                + start
                + " and a.row_num <= "
                + end;


再对这1W条数据进行处理
Java code
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        PreparedStatement pstmt = null;
        try {
            conn.setAutoCommit(false);

            pstmt =
                conn.prepareStatement(
                    "update PAY_PREPAYMENT_WT_SEND set REMAIN_MONTH = REMAIN_MONTH-1, LAST_UPDATE =?,COUNTNUM = COUNTNUM+1 WHERE id =?");
            for (int i = 0; i < list.size(); i++) {
                CTSHWTPayMentEntity pe = (CTSHWTPayMentEntity) list.get(i);
                pstmt.setString(2, pe.getId());
                pstmt.setTimestamp(
                    1,
                    Timestamp.valueOf(fmt.format(pe.getLast_update())));
                pstmt.addBatch();

            }
            pstmt.executeBatch();
            conn.commit();
        } catch (SQLException e) {
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (null != pstmt)
                    pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


结果发现更新的数据少了几千条,不知道什么原因,没报任何错误。
 麻烦达人们看下

------解决方案--------------------
是rownum的问题吧,

检查你的逻辑,这里不是ps的问题。

btw

ps不是这样用的。这样就失去了ps的意义。
------解决方案--------------------
没有异常吗?
int[] executeBatch()
看看这个调用的返回值,