2017-02-24 55 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

相關問題