liuq1224 发表于 2008-03-15 02:37

寻求答案

摘抄于http://www.javaworld.com.tw/jute/post/print?bid=21&id=180045

1.为什么我用prepareStatement执行批量插入总是只能插入一条数据?Copy to clipboard
Posted by: andy840920
Posted on: 2007-01-11 18:06


db = new Database(dbURL, false);   
    conn = db.getConn();   
    pstmt = conn.prepareStatement(preSql);   
      
    conn.setAutoCommit(false);   
    for (int j = 0; j < commitCount; ++j) {   
      try {   
            pstmt.clearBatch();   
            pstmt.clearParameters();   
            String[] tmp = ((String[])setConf.elementAt(j));   
            for (int i = 1; i <= tmp.length; ++i) {   
                pstmt.setString(i, tmp);   
            }   
            pstmt.addBatch();   
      } catch (SQLException e) {   
            Loger.log.error("some operation about pstmt throw SQLException!\n" + e);   
            continue;   
      }   
    }   
    tmpRets = pstmt.executeBatch();   
    conn.commit();


我用上面的代码执行批量的插入,只执行一次executeBatch操作,但每次只能插入第一条数据,所以更通的办法是在for里面执行这个操作,这样就是一条数据就提交一次了,效率肯定低。但我不知道为什么会这样。我看网上很多类似代码也是这样的逻辑的啊。

另外,如果我不需要事务,我能否不要setAutoCommit,这样好像又不是一次提交是吗?而是每次都提交吗?

--------------------------------------------------------------------------------
2.Re:为什么我用prepareStatement执行批量插入总是只能插入一条数据? Copy to clipboard
Posted by: andy840920
Posted on: 2007-01-11 21:50

我把pstmt.clearBatch()放在for前面去了,可执行后出现:


java.sql.SQLException: System or internal error java.lang.ArrayIndexOutOfBoundsException: 22 >= 22

的异常,我的prepared sql是一上需要设置11列的语句,所以是在for中第二次设置时出了错,我不知道为什么会有这样的问题,我也做了pstmt.clearParameters(); 操作啊。

--------------------------------------------------------------------------------
3.Re:为什么我用prepareStatement执行批量插入总是只能插入一条数据? Copy to clipboard
Posted by: andy840920
Posted on: 2007-01-12 12:06

我调试了一下发现,我要设置的参数是11个,在循环两次后都没有问题,第三次时设置第一个参数就会抛出下面的异常System or internal error java.lang.ArrayIndexOutOfBoundsException: 22 >= 22
如果我要设置的参数是10个的话,在循环两次后还是没问题,第三次时设置第一个参数就会出现类似的异常信息:
System or internal error java.lang.ArrayIndexOutOfBoundsException: 20 >= 20

我就想为什么总是在第三个batch里的第一次设置参数就出异常呢?我也很是不明白。

liuq1224 发表于 2008-03-17 09:20

我找到答案了,jdbc 驱动有问题
页: [1]
查看完整版本: 寻求答案