Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:ORA-01000:截断表时超出了最大打开游标数_Java_Oracle - Fatal编程技术网

java.sql.SQLException:ORA-01000:截断表时超出了最大打开游标数

java.sql.SQLException:ORA-01000:截断表时超出了最大打开游标数,java,oracle,Java,Oracle,我在截断架构中的所有表时遇到此异常。 我在Java代码中截断了3个模式,第一个方法从给定的模式名中获取表名列表,第二个方法执行“truncate table_name”查询。 我对截短第一个和第三个模式时代码总是成功感到困惑。但是在第二个模式上执行时,我得到了ORA-01000的错误。 我的截断代码是 private void truncateTable(Connection conn, String tableName) { PreparedStatement ps = nul

我在截断架构中的所有表时遇到此异常。
我在Java代码中截断了3个模式,第一个方法从给定的模式名中获取表名列表,第二个方法执行“truncate table_name”查询。
我对截短第一个和第三个模式时代码总是成功感到困惑。但是在第二个模式上执行时,我得到了ORA-01000的错误。
我的截断代码是

    private void truncateTable(Connection conn, String tableName) {
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(Utility.TRUNCATE_TABLE + tableName);
        ps.executeUpdate();
    } catch (SQLException e) {
        log.error("SQLException occured while getting table names from schema", e);
    } finally {
        Utility.free(ps, null, null);
    }
}


    private List<String> getAllTableNames(Connection conn) {
    PreparedStatement ps = null;
    ResultSet rs = null;
    List<String> list = new ArrayList<String>();
    try {
        ps = conn.prepareStatement(Utility.SELECT_ALL_TABLE_NAMES);
        rs = ps.executeQuery();
        while (rs.next()) {
            list.add(rs.getString("TABLE_NAME"));
        }
    } catch (SQLException e) {
        log.error("SQLException occured while getting table names from schema", e);
    } finally {
        Utility.free(ps, rs, null);
    }
    return list;
}

    public static void free(PreparedStatement ps, ResultSet rs, Connection conn) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {
            log.error("Error occurred while closing ResultSet",e);
        }
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) {
            log.error("Error occurred while closing PreparedStatement",e);
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
            log.error("Error occurred while closing Connection",e);
        }
    }
}
private void truncateTable(连接连接,字符串表名){
PreparedStatement ps=null;
试一试{
ps=conn.preparest陈述(Utility.TRUNCATE_TABLE+tableName);
ps.executeUpdate();
}捕获(SQLE异常){
log.error(“从架构获取表名时发生SQLException”,e);
}最后{
免费(ps,null,null);
}
}
私有列表getAllTableNames(连接连接){
PreparedStatement ps=null;
结果集rs=null;
列表=新的ArrayList();
试一试{
ps=conn.prepareStatement(实用程序。选择所有表格名称);
rs=ps.executeQuery();
while(rs.next()){
添加(rs.getString(“表名称”);
}
}捕获(SQLE异常){
log.error(“从架构获取表名时发生SQLException”,e);
}最后{
免费实用程序(ps、rs、null);
}
退货清单;
}
公共静态无效(准备语句ps、结果集rs、连接连接){
如果(rs!=null){
试一试{
rs.close();
}捕获(SQLE异常){
log.error(“关闭结果集时出错”,e);
}
}
如果(ps!=null){
试一试{
ps.close();
}捕获(SQLE异常){
log.error(“关闭PreparedStatement时出错”,e);
}
}
如果(conn!=null){
试一试{
康涅狄格州关闭();
}捕获(SQLE异常){
log.error(“关闭连接时出错”,e);
}
}
}
Oracle中的代码或模式配置有什么问题?
如何解决此问题?

请检查代码,确保在使用光标后关闭光标。如果问题仍然存在,请将OPEN_CURSORS设置为更大的值。

如果您正在迭代由
getAllTableNames
生成的列表,并在紧循环中调用
truncateTable
,您在
finally
块中的
free
调用可能会被延迟,并且累积到无法在下一次迭代中足够快地清除的程度-因为您只知道
finally
将在某个点被调用,而不一定是在控件返回给调用方之前立即调用

模式大小会对这一点产生影响,因此小模式成功而大模式失败可能是有意义的。如果发生了这种情况,那么您应该在
try
中以及在
finally
中调用
free

    private void truncateTable(Connection conn, String tableName) {
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(Utility.TRUNCATE_TABLE + tableName);
        ps.executeUpdate();
        Utility.free(ps, null, null);
        ps = null;
    } catch (SQLException e) {
        log.error("SQLException occured while getting table names from schema", e);
    } finally {
        if (ps != null) {
            Utility.free(ps, null, null);
        }
    }
}

如果
Utility.free
检查
ps
是否为空,则
finally
块中的检查可能是冗余的,但没有它,如果没有
SQLException

请确保在获取表名时关闭所有这些结果集。是的,确保我添加了我的代码,并且在异常成功截断其他架构的表后,请暂时将打开的游标设置为更大的值,这将对您有所帮助是的我在列表上迭代,Utility.free方法检查ps是否为null,并在方法内关闭ps。在许多表的架构中出现错误。超过50个表,但其他成功的模式都有10个表。可能会导致错误。@Ugur-在
中移动
释放
是否可以解决问题?如果在该调用中正确释放,那么架构大小应该不再相关。正如另一种想法一样,
free
是否确实释放了
ps
,即使
rs
为空?不幸的是,它不起作用。我认为这是关于模式的。因为我总是得到相同的错误和相同的模式。@Ugur-我只能认为
free
没有按预期工作;也许您可以将该方法的代码添加到问题中(而不是作为注释)?