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
没有按预期工作;也许您可以将该方法的代码添加到问题中(而不是作为注释)?