0

在我的代码中,我使用 4 个准备好的语句来(选择、插入、更新)我的表,我还必须在 for 循环中使用这些语句,因为我需要处理大量数据,我只使用一个数据库连接和语句在 for 循环之前只打开一次,我在每次迭代中使用 addBatch(),在循环结束后,语句使用 executeBatch() 执行,语句在 finally 块中关闭,但在第二次迭代后仍然抛出 MaxOpenPreparedStatements 异常! !, 我能做些什么来避免这种情况?

try{
     pStat1 = conn.prepareStatement("insert into...");
     pStat2 = conn.prepareStatement("update...");
     pStat3 =  conn.prepareStatement("insert into...");
     pStat4 = conn.prepareStatement("update...");


     for (.....) {
          //set parameters
          pStat1.addBatch();
          //set parameters
          pStat2.addBatch();
          //set parameters
          pStat3.addBatch();
          //set parameters
          pStat4.addBatch();

          }      
            pStat1.executeBatch();
            pStat2.executeBatch();
            pStat3.executeBatch();
            pStat4.executeBatch();
          } catch (Exception e) {
                 e.printStackTrace();
          }finally {
                 if(pStat1!= null){
                       try {
                              pStat1.close();
                       } catch (SQLException e) {
                              e.printStackTrace();
                       }
                 }
                 if(pStat2!= null){
                       try {
                              pStat2.close();
                       } catch (SQLException e) {
                              e.printStackTrace();
                       }
                 }

                 if(pStat3!= null){
                       try {
                              pStat3.close();
                       } catch (SQLException e) {
                              e.printStackTrace();
                       }
                 }

                 if(pStat4!= null){
                       try {
                              pStat4.close();
                       } catch (SQLException e) {
                              e.printStackTrace();
                       }
                 }

提前致谢。

4

2 回答 2

0

我不确定它会解决问题。但可能会。尝试一次

        pStat1.executeBatch();
          //close pStat1 here
        pStat2.executeBatch();
          //close pStat2 here
        pStat3.executeBatch();
          //close pStat3 here
        pStat4.executeBatch();
          //close pStat4 here
于 2013-05-24T12:41:47.253 回答
0

将其展开为四个循环,并在开始下一个循环之前从准备到关闭完全处理每个 PreparedStatement。

如果你可以的话。如果这些陈述是相互依存的,那么你只需要改变它。

于 2013-05-24T12:57:10.500 回答