0

在截断模式中的所有表时出现此异常。
我在我的 Java 代码中截断了 3 个模式,第一种方法从给定的模式名称中获取表名列表,第二种方法执行“TRUNCATE TABLE 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);
        }
    }
}

代码有什么问题,或者 Oracle 中的模式配置有什么问题?我该如何解决这个问题?

4

2 回答 2

1

如果您要遍历生成的 ListgetAllTableNamestruncateTable在紧密循环中free调用,则您在finally块中的调用可能会被延迟并堆积到它们没有足够快地清除以进行下一次迭代的程度 - 因为您只知道finally意志在某个时刻被调用,不一定是在控制权返回给调用者之前立即调用。

架构大小会对此产生影响,因此小型架构成功而大型架构失败可能是有意义的。如果这是正在发生的事情,那么您应该free在 内部try以及在内部调用finally

    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为 null 则该finally块中的检查可能是多余的,但如果没有它,free如果没有它,将被调用两次SQLException

于 2013-07-29T11:10:35.357 回答
0

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

于 2013-07-29T10:10:51.867 回答