使用 Oracle 的 C# 中出现 ORA-00604、ORA-01000 错误;超出最大打开游标数



大家好:我有一个程序正在运行 4 个线程,这些线程与 Oracle 数据库通信。 我在每个线程本地都有 Oracle 连接,我正在使用 USING 语句以及手动关闭记录集并关闭连接。 据我了解,当数据库上的打开记录集多于配置的游标时,会出现ORA-01000错误。 我不明白为什么我的记录集保持打开状态或为什么我收到此错误。 代码如下:

static void CheckPaths()
{
int pathcount = paths.Count; //paths is a typed list           
Parallel.ForEach(paths, new ParallelOptions { MaxDegreeOfParallelism = 4 }, (p) =>
{
try
{
CheckSinglePathAllHours(p);
}
catch (Exception ex)
{
//there is logging here, this is where the exception hits
}
});
}
static void CheckSinglePathAllHours(Path p)
{
string sqlBase = @"Select * from table ";//this is actually a big SQL statement
using (DBManager localdbm = new DBManager())
{
string sql = sqlBase;             
OracleDataReader reader = localdbm.GetData(sql);
while (reader.Read())
{
//process the path, query always returns 24 or less rows
}
reader.Close();
reader = null; //is this even necessary?               
localdbm.Close(); //is this necessary in conjunction with the USING statement?
}
}
class DBManager : IDisposable
{
OracleConnection conn;
OracleCommand cmd;
public DBManager()
{
string connStr = "blah blah blah";            
conn = new OracleConnection(connStr);
conn.Open();
cmd = conn.CreateCommand();
}
public OracleDataReader GetData(string sql)
{
cmd.CommandText = sql;
cmd.CommandTimeout = 900;
return cmd.ExecuteReader();
}
public void RunSQL(string sql)
{
cmd.CommandText = sql;
cmd.CommandTimeout = 900;
cmd.ExecuteNonQuery();
}
public void Close()
{
conn.Close();
}
public void Dispose()
{
try
{
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

代码通常会在异常之前运行大约一两分钟。 异常消息是双重的:ORA-00604:递归 SQL 级别 1 发生错误;和 ORA-01000:超出最大打开游标数。 知道我做错了什么吗?

更改了要调用的代码。Dispose() on OracleDataReader 和 OracleConnection 上,如 Paul Abbott 所建议的那样。 还将数据库上每个会话的游标数从 50 个增加到 150 个。

最新更新