我试图在应用程序中使用Oracle的托管数据访问客户端(版本4.121.1.0)。我对数据库进行小查询没有问题,但是我遇到了一个返回大结果的查询问题。
我从一张表中选择了两列(所有行),大约有137,000条记录。一列是数字(id),另一列是文本的大CLOB。我使用数据读取器将带有id的所有clob数据读入对象列表。所有这一切都很好,需要大约10分钟来完成所有这些(clobs可能非常大)。
填充数组后,我在连接上调用Close()方法并等待,等待,等待...连接关闭大约需要1小时25分钟。连接关闭后,应用程序继续正常运行。为什么关闭连接需要这么长时间?
这是我当前代码中显示问题的一个示例。
List<StudentData> studentData = new List<StudentData>();
using (OracleConnection connection = new OracleConnection(this.ConnectionString))
{
try
{
// Get all the clobs
OracleCommand cmdGetClobs = new OracleCommand("SELECT STUDENT_NUMBER, CUSTOM FROM PS.STUDENTS", connection);
connection.Open();
var rdr = cmdGetClobs.ExecuteReader();
while (rdr.Read())
{
System.Char[] clobData = new System.Char[rdr.GetOracleClob(1).Length];
rdr.GetChars(1, 0, clobData, 0, (int)rdr.GetOracleClob(1).Length);
string studentNumber = rdr["STUDENT_NUMBER"].ToString().Trim();
StudentData data = new StudentData()
{
Student_Number = studentNumber,
ClobValue = clobData
};
studentData.Add(data);
}
// I've tried with, and without calling the dispose methods.
rdr.Dispose();
cmdGetClobs.Dispose();
connection.Close(); // <--- App will hang here for about 1.5 hours
connection.Dispose();
}
finally
{
if (connection.State != System.Data.ConnectionState.Closed)
{
connection.Close();
}
}
}
答案 0 :(得分:1)
OracleClob本身实现IDisposable。根据您所拥有的学生人数,将有大量的Clobs需要清理。
您能做这样的事看看是否有帮助吗?
while (rdr.Read())
{
using (OracleClob clobData = rdr.GetOracleClob(1))
using (StreamReader reader = new StreamReader(clobData))
{
string studentNumber = rdr["STUDENT_NUMBER"].ToString().Trim();
StudentData data = new StudentData()
{
Student_Number = studentNumber,
ClobValue = reader.ReadToEnd()
};
studentData.Add(data);
}
}