.NET : 一定不要忘记关闭DataReader对象
今天早上处理一个紧急的客户反应问题,这是去年开发的一套绩效考核系统。他们现在集团在推广使用,用户数多起来之后就发现某个页面响应速度非常慢,甚至会报告错误,无法完成操作。
经过检查,发现有一个方法用到了DataReader对象,但当时可能是疏忽了,忘记关闭该对象。特此记录这个问题,以为警示。
/// <summary> /// 循环按照编号去取某个员工的某个指标的值 /// </summary> /// <param name="taskList"></param> /// <returns></returns> public static DataSet GetGroupExamineFormDataItems(List<string> taskList,string code) { DataSet ds = new DataSet(); DataTable tb = new DataTable(); tb.Columns.Add("EmployeeName"); tb.Columns.Add("SelectValue"); tb.Columns.Add("TaskId"); ds.Tables.Add(tb); foreach (string item in taskList) { List<SqlParameter> param = new List<SqlParameter>(); param.Add(new SqlParameter("@Id", item)); param.Add(new SqlParameter("@Code", code)); SqlDataReader reader = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, "GetGroupExamineFormDataItems", param.ToArray()); while (reader.Read()) { DataRow row = tb.NewRow(); row[0] = reader[0]; row[1] = reader[1]; row[2] = item; tb.Rows.Add(row); } reader.Close(); } return ds; }
去年用的时候,因为用户数不太多,基本上没有察觉这个问题。
这个DataReader没有关闭的后果是造成它的Connection无法关闭,导致有很多连接被空闲,但是又没有销毁。这不能不说是一个低级错误。
当然,这是一个疏忽,因为无论如何我们都知道应该是要关闭的,当时写代码估计是比较赶时间而出了差错。