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

如何解决ORA-0300:最大打开游标超过异常[重复]

窦哲彦
2023-03-14

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

     public void connectionexample(String email)
     {

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;        
        try {            
            conn = db.getConnection();            
            ps = conn.prepareStatement(select_query);            
            ps.setString(1, email);
            rs = ps.executeQuery();
            if(rs.next()) {
                  ps = conn.prepareStatement(update_query);
                  ps.setString(1, email);                  
                  ps.executeUpdate();                                    
            } else {
                ps = conn.prepareStatement(insert_query);                  
                ps.setString(1, email);
                ps.executeUpdate();             
            }            
        } catch(Exception e) {                    
            LOG.error("Exception occured ", e);                     
        } finally {                    
            DATABASE.release(rs);
            DATABASE.release(ps);
            DATABASE.release(conn);
        }      
    }  

共有2个答案

云捷
2023-03-14

您正在使用准备好的语句ps

public void connectionexample(String email)
{
  Connection conn = null;
  PreparedStatement ps = null;
  PreparedStatement ps2 = null; -- Use another variable for the second prepared statement
  ResultSet rs = null;        
  try {            
    conn = db.getConnection();            
    ps = conn.prepareStatement(select_query);            
    ps.setString(1, email);
    rs = ps.executeQuery();
    if(rs.next()) {
      ps2 = conn.prepareStatement(update_query); -- Assign this to the second variable
    } else {
      ps2 = conn.prepareStatement(insert_query);                  
    }            
    ps2.setString(1, email);
    ps2.executeUpdate();             
  } catch(Exception e) {                    
    LOG.error("Exception occured ", e);                     
  } finally {                    
    DATABASE.release(rs);
    DATABASE.release(ps);
    DATABASE.release(ps2);  -- Make sure you also close the second prepared statement
    DATABASE.release(conn);
  }
}

但是,通过使用SQLMERGE语句,可以避免第二次往返数据库

程飞星
2023-03-14

您会得到这个错误,因为您多次使用相同的PrePapred语句:

ps = conn.prepareStatement(select_query);//<<----------------------Here
...
if (rs.next()) {
    ps = conn.prepareStatement(update_query);//<<-------------------Then here
    ...
} else {
    ps = conn.prepareStatement(insert_query);//<<-------------------or here
    ...
}

为了解决问题,您必须关闭语句并为新查询创建一个新语句,或者为了更好的方式,在不同的方法中分离操作,每个方法创建并释放其语句和连接。

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

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

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

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

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