2017-02-24 31 views
0

在Eclipse中,我得到这个错误:**错误ORA-01000:最大打开游标超出 我已经关闭连接块最后,但我不知道为什么我收到这个错误,这里是我的代码JAVA。 请帮帮我!错误ORA-01000:超过最大打开游标

for (DossierAMO dos = null; it.hasNext();) { 
      PreparedStatement ps = null; 
      ResultSet rs = null; 
      PreparedStatement ps2 = null; 
      ResultSet rs2 = null; 
      try { 
       dos = (DossierAMO) it.next(); 
       //PreparedStatement ps = null; 
       //ResultSet rs = null; 
       /*try 
       * 
       {*/ 
       System.out.println("Imma"+dos.getImma()); 
        ps = cnnOracle.getConnexion().prepareStatement(
          "select count(IMM_IMM_V_NUM_IMM) from [email protected]_dist where SAL_C_DS =21 and IMM_IMM_V_NUM_IMM =?", 
          ResultSet.TYPE_FORWARD_ONLY, 
          ResultSet.CONCUR_READ_ONLY 
          ); 
        ps.setString(1,dos.getImma()); 
        rs = ps.executeQuery(); 
        if (rs.next()){ 

         if (rs.getInt(1) != 0) 
          //System.out.println("> Ecriture des dossiers d'indus dans le fichier d'indus2"); 
          fichierIndius2.ecrireDossier(dos); 
         else 
         { 


          ps2 = cnnOracle.getConnexion().prepareStatement(
          "select count(DOS_N_NUM_DOS) from [email protected]_dist where IMM_IMM_V_NUM_IMM =?", 
          ResultSet.TYPE_FORWARD_ONLY, 
          ResultSet.CONCUR_READ_ONLY 
          ); 
          ps2.setString(1,dos.getImma()); 
          rs2 = ps2.executeQuery(); 
          if (rs2.next()){ 

          if (rs2.getInt(1) != 0) 

          fichierIndius2.ecrireDossier(dos); 

          else{ 
       fichierIndius.ecrireDossier(dos); 
     }}}} 
      } catch (Exception ex) { 
       requete.fermer(); 

       fichierIndius.fermerSansException(); 
       fichierIndius2.fermerSansException(); 
       cnnAS400.fermerConnexion(); 
       cnnAS400FO.fermerConnexion(); 
       cnnOracle.fermerConnexion(); 
       System.err 
         .println("Erreur d'écriture dans le fichier d'indus!/  EXC : " 
           + ex); 
       return; 
      } 
      finally{ 

       if (rs != null) 
        try { 
         rs.close(); 
        } catch (Exception exx) { 
        } 
       if (rs2 != null) 
        try { 
         rs2.close(); 
        } catch (Exception exx) { 
        } 
       if (ps != null) 
        try { 
         ps.close(); 
        } catch (Exception exx) { 
        } 
       if (ps2 != null) 
        try { 
         ps2.close(); 
        } catch (Exception exx) { 
        } 
      } 






     } 
+0

你为什么将rs和ps设置为null?这将阻止那些在finally块中被关闭的人。而且你正在尝试*关闭'ps'而不是'ps2'。你什么时候认为你正在关闭连接 - 因为你没有指向你打开的两个变量的变量? (除了可能在异常处理程序,取决于这些调用做什么。) –

+0

亚历克斯我已经修改这些行,但我仍然得到相同的错误! – salma

+0

在回答问题后修改问题不是很有帮助。你仍然没有关闭连接。 –

回答

1

你(或曾经是)设置rsps为空在else,即当rc.getInt(1) == 0。这meens,当你到了finally块,这些测试会失败,并psrs无法关闭:

  if (rs != null) 
       try { 
        rs.close(); 
       } catch (Exception exx) { 
       } 
      .... 
      if (ps != null) 
       try { 
        ps.close(); 
       } catch (Exception exx) { 
       } 

正如@APC已经指出的那样,你也(或曾经是)关闭了错误的声明这里:

  if (ps2 != null) 
       try { 
        ps.close(); 
       } catch (Exception exx) { 
       } 

更大的问题是,你没有释放你所说的连接。还有就是cnnOracle.fermerConnexion()一个电话,但只异常处理程序:

... 
     } catch (Exception ex) { 
      requete.fermer(); 

      fichierIndius.fermerSansException(); 
      fichierIndius2.fermerSansException(); 
      cnnAS400.fermerConnexion(); 
      cnnAS400FO.fermerConnexion(); 
      cnnOracle.fermerConnexion(); 
      System.err 
        .println("Erreur d'écriture dans le fichier d'indus!/  EXC : " 
          + ex); 
      return; 
     } 
     finally{ 
... 

您需要关闭在finally块的连接,以及,你(正确)关闭语句和结果集之后。

您还需要看看cnnOracle.fermerConnexion()正在做什么。您拨打cnnOracle.getConnexion()两次,每次准备好一次。如果那些返回不同连接,并且fermerConnexion()只关闭一个,那么你也在那里泄漏。你需要调查每个内部发生的事情。

使用一个连接会更加正常,因此您有一个变量,称为conn,您使用cnnOracle.getConnexion()进行设置,然后将您的准备好的数据创建为ps = conn.prepareStatement(...)

您目前似乎正在获取连接并重新创建并销毁循环中的预准备语句。在循环之前获得连接并准备语句会更有效率,并在循环内部执行它们。然后在循环完成后关闭准备好的语句和连接(并且仍然在异常处理程序中,因为它返回给调用者,并且try块的finally块将不再关闭它们)。

+0

非常感谢亚历克斯的回应,我尽力遵循你在代码中提到的内容,但现在我收到了错误消息:java.lang.NullPointerException。 – salma

+0

我只是忘记用null来实例化预备的语句。现在它可以工作。非常感谢! – salma

2

" i don't know why i'm getting this error"

难道是这个错字?

  if (ps2 != null) 
       try { 
        ps.close(); 
       } catch (Exception exx) { 
       } 

你关闭psps2

+0

APC,我修改,但我仍然得到相同的错误! – salma

+0

fichierIndius2.ecrireDossier(dos)的功能是什么;和fichierIndius.ecrireDossier(dos); ?他们有没有关系数据库?如果是,你可以发布代码? – Massimo

+0

也是cnnOracle.getConnexion(),它有什么作用? – Massimo

相关问题