日期:2014-05-18  浏览次数:20862 次

为什么我用prepareStatement执行批量插入总是只能插入一条数据?
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[i   -   1]);      
                        }      
                        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,这样好像又不是一次提交是吗?而是每次都提交吗?


------解决方案--------------------
为什么要调用clearBatch()?

JDK DOC对这个方法的描述:
Empties this Statement object 's current list of SQL commands.
从这句话来看,岂不是整个SQL命令的列表都被清空了?

另外如果没有必要clearParameters()也无需调用。
DOC的说法是:
However, in some cases it is useful to immediately release the resources used by the current parameter values

除非你有必要即时释放当前参数占用的资源,否则没必要调用该方法。