다음 코드를 사용하여 열린 커서 제한 문제가 발생합니다. 오라클 db의 열린 커서 제한은 약 1000으로 설정됩니다. 다음 코드는 using
문 (필자는 생각합니다)에서 모든 것을 얻었지만 커서를 유지하는 것처럼 보입니다. (참고, outRefCursor2에서 아무 것도 읽을 필요가 없습니다.)Oracle ODP.NET 커서 누출?
ODP.net을 사용하여 using
또는 다른 일부가 누락 되었습니까?
는 예외 내가 DB 커서를 모니터링하기 위해 온라인으로 볼이 조각을 사용하고 반복 596
static List<Thing> GetDetailsForItems(List<string> items) {
DateTime start = DateTime.UtcNow;
var things = new List<Thing>();
var spname = "SP_GET_THING_DETAILS";
var outRefCursorName1 = "p_ref_cursor1";
var outRefCursorName2 = "p_ref_cursor2";
// Create params
var pInput1 = new OracleParameter("p_input1",
OracleDbType.Varchar2, ParameterDirection.Input);
pInput1.Value = "";
// Input 2 can be blank
var pInput2 = new OracleParameter("p_input2",
OracleDbType.Varchar2, ParameterDirection.Input);
pInput2.Value = "";
var outRefCursor1 = new OracleParameter(outRefCursorName1,
OracleDbType.RefCursor, ParameterDirection.Output);
var outRefCursor2 = new OracleParameter(outRefCursorName2,
OracleDbType.RefCursor, ParameterDirection.Output);
int count = 0;
using (var conn = new OracleConnection(CONN_STR)) {
conn.Open();
using (var cmd = conn.CreateCommand()) {
cmd.Parameters.Add(pInput1);
cmd.Parameters.Add(pInput2);
cmd.Parameters.Add(outRefCursor1);
cmd.Parameters.Add(outRefCursor2);
cmd.CommandText = spname;
cmd.CommandType = CommandType.StoredProcedure;
foreach (string value in items) {
count++;
cmd.Parameters[pInput1.ParameterName].Value = value;
var execVal = cmd.ExecuteNonQuery();
using (var refCursor = (Types.OracleRefCursor)
cmd.Parameters[outRefCursorName1].Value) {
using (var reader = refCursor.GetDataReader()) {
while (reader.Read()) {
// read columns
things.Add(reader["COLUMN_A"].ToString());
}
} // close reader
} // close cursor
} // end foreach
} // close command
} // close connection
int seconds = (DateTime.UtcNow - start).Seconds;
Console.WriteLine("Finished in {0} seconds", seconds);
return things;
}
에서 지속적으로 발생합니다. 코드를 단계별로 실행하면서 커서가 합쳐지는 것을 볼 수 있습니다. 그리고 그들은 단지 cmd.ExecuteNonQuery()
라인에서 계속 추가합니다. 나는 성명서를 사용하고 나면 한방울도 못 본다. 당신은 여전히 유효한 커서를 반환하는 경우이를 압축을 풉니을 종료해야합니다 outRefCursor2
를 사용하지 않는 경우에도
select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur,
s.username, s.machine
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current'
and machine='MY COMPUTER'
group by s.username, s.machine
order by 1 desc;
이 정답 : 쉬운이 같은 "사용"
뭔가를 사용하는 것입니다. –