首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误ORA-01000:超出最大打开游标

错误ORA-01000:超出最大打开游标
EN

Stack Overflow用户
提问于 2017-02-24 14:26:05
回答 2查看 965关注 0票数 0

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

代码语言:javascript
复制
 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) {
                    }
            }






        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-24 15:34:04

您正在(或曾经)将rsps设置为空在else中,即当rc.getInt(1) == 0。这意味着,当您到达finally块时,这些测试将失败,并且psrs无法关闭:

代码语言:javascript
复制
            if (rs != null)
                try {
                    rs.close();
                } catch (Exception exx) {
                }
            ....
            if (ps != null)
                try {
                    ps.close();
                } catch (Exception exx) {
                }

正如@APC已经指出的那样,您也(或曾经)在这里结束了错误的声明:

代码语言:javascript
复制
            if (ps2 != null)
                try {
                    ps.close();
                } catch (Exception exx) {
                }

更大的问题是你没有像你声称的那样释放你的连接。有一个对cnnOracle.fermerConnexion()的调用,但仅在异常处理程序中:

代码语言:javascript
复制
...
        } 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块的最后一个块将不再关闭它们)。

票数 1
EN

Stack Overflow用户

发布于 2017-02-24 14:38:02

“我不知道我为什么要犯这个错误”

会是这个错误吗?

代码语言:javascript
复制
            if (ps2 != null)
                try {
                    ps.close();
                } catch (Exception exx) {
                }

你要关闭ps而不是ps2

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42441092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档