Oracle ManagedDataAccess客户端和关闭连接

时间:2014-03-18 17:07:35

标签: .net oracle c#-4.0

我试图在应用程序中使用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();
         }
     }
 }

1 个答案:

答案 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);
         }
     }