当前位置: 首页 > 知识库问答 >
问题:

错误ORA-01000:超过最大打开游标数

丁慈
2023-03-14

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

 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 d_salaire@prod_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 d_dossier@prod_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) {
                    }
            }






        }

共有2个答案

莫河
2023-03-14

您正在(或曾经)将rsps设置为null,即当rc.getInt(1)==0时。这意味着当您到达最终块时,这些测试将失败,并且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{
...

在(正确地)关闭语句和结果集之后,还需要关闭最后块中的连接。

您还需要查看cnnOracle.fermerConnexion()正在做什么。您可以调用cnnOracle.getConnexion()两次,对于每个准备好的语句都调用一次。如果这些返回不同的连接,并且fermerConnexion()只关闭一个,那么您也在泄漏。您需要调查每个连接内部发生了什么。

使用一个连接会更正常,因此您有一个名为sayconn变量,可以用cnnOracle设置。getConnexion(),然后将准备好的语句创建为ps=conn.prepareStatement(…)

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

戚京
2023-03-14

"我不知道为什么我得到了这个错误"

可能是这个打字错误吗?

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

您正在关闭ps而不是ps2

 类似资料:
  • 我得到一个ORA-01000 SQL异常。所以我有一些与之相关的疑问。 编辑1:6。使用弱/软引用语句对象是否有助于防止泄漏? 编辑2:1。有没有办法,我可以找到我的项目中所有缺失的“statement.close()”?我知道这不是内存泄漏。但是我需要找到一个符合垃圾收集条件的语句引用(在那里没有执行close())?有工具吗?还是我必须手动分析? 请帮我理解一下。

  • 问题内容: 我收到了ORA-01000 SQL异常。因此,我对此有一些疑问。 最大打开游标是否与JDBC连接的数量完全相关,还是与我们为单个连接创建的语句和结果集对象相关?(我们正在使用连接池) 有没有一种方法可以配置数据库中的语句/结果集对象的数量(如连接)? 是否建议在单线程环境中使用实例变量statement / resultset对象而不是方法local statement / resul

  • 我已经连接了Oracle数据库。现在我要面对 我使用代码插入数据: 它只适用于前500条记录,然后我有错误Ora-1000。我总共有大约6000条记录。我发现一些主题说应该改变配置,但我不能改变配置。 有没有其他方法可以解决这个错误?

  • 我得到了ORA-0300:超出了最大打开游标数

  • 我们的应用程序连接到Oracle数据库,我们使用Spring提供的JDBCTemboard与数据库交互。根据Spring JDBCTemboard的留档,它确保它将关闭所有连接和游标。但显然我们得到了以下打开游标的异常。 ORA-01000:组织上超过了最大打开游标数。springframework。jdbc。支持AbstractFallbackSQLExceptionTranslator。在or

  • 早上好,我正在开发一个React应用程序,通过REST API与后端通信。 该应用程序体系结构还使用 React 路由器,并使用服务器提供并存储在中的 JWT 令牌实现身份验证功能。 基本上: 用户连接到应用程序 如果用户未登录,则重定向到登录页面 登录后,它会重定向到带有路径的主页,其中应该显示带有路径的组件和带有路径的组件(如果一个很好地理解React路由器的工作) 在启动应用程序时,用户被正