前些天,博主写了关于目视化的小项目,用的SqlHelper。
手写的sql在数据库执行明明不到1s数据就出来了,数据量也不是很大,但是页面上ajax请求数据有时会超时(这里博主每3秒钟会请求一次),主要是刚开始不会,但在运行几十秒后就会一直超时。这是博主就百思不得其解,查阅了诸多资料,被我发现了端倪。
查询链接数sql语句:select * from sysprocesses where dbid in (select dbid from sysdatabases where name='你的数据名')
我用sql语句查询了下我的用户链接数发现100多个,原来是我把数据库连接池给刷炸了。。。我就再想难道我SqlHelper 读取数据的链接字符串没关闭导致的,但是SqlConnection已经关闭了。如下图所示:
public static SqlDataReader ExecuteReader(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
try
{
SqlCommand cmd = new SqlCommand(commandText, conn);
PrepareCommand(cmd, commandType, conn, commandText, commandParameters);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rdr;
}
catch
{
conn.Close();
throw;
}
}
在我绝望的时候我发现是不是SqlDataReader 没有关闭呢,所以我就在原来代码的基础上添加了 dr.Close();看似完全不对的代码,但是却解决了我都困扰。不知道这是SqlHelper的bug还是SqlDataReader本身就需要关闭。之前怎么没发现这个问题呢?难道是操作数据库太频繁的原因?也希望知道的小伙伴一起探讨哦!
SqlDataReader dr = SqlHelper.ExecuteReader(CommandType.Text, sql);
List<ManifoldRackRecord> list = new List<ManifoldRackRecord>();
while (dr.Read())
{
ManifoldRackRecord model = new ManifoldRackRecord();
list.Add(model);
}
dr.Close();