我已阅读并实现了Microsoft建议的几种不同版本的查询SQL Server数据库的方法。在我阅读的所有内容中,每个查询都被using语句包围,例如使用某种方法DoQuery
:
List<List<string>> DoQuery(string cStr, string query)
{
using(SqlConnection c = new SqlConnection(cStr))
{
c.Open();
using(SqlCommand cmd = new SqlCommand(queryStr, c))
{
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read() )
{
...
//read columns and put into list to return
}
// close all of the using blocks
}
}
}
// return the list of rows containing the list of column values.
}
我需要针对同一数据库的不同查询字符串运行此代码数百次。似乎每次创建一个新连接都是低效的,而每次浪费都将其丢弃。
我应该如何构造它以便使其高效?当我尝试不使用using块并将连接传递到DoQuery
方法时,我收到有关该连接的消息尚未关闭。如果我在查询后关闭它,那么我会收到有关它未打开的消息。
我也在尝试改善这一点,因为我会变得越来越随意
IOException:无法从传输连接读取数据:在非阻塞套接字上的操作将阻塞。
我目前是数据库的唯一用户,并且我没有在多个线程或异步状态下执行任何操作。只需循环查询字符串并在它们上运行DoQuery
。
我的结构是否可能是该问题的一部分,即没有足够快地释放资源,从而导致连接阻塞?
我在效率和阻塞问题上陷入困境。预先感谢。
答案 0 :(得分:0)
事实证明,查询结构很好,查询也很好。问题是我在每个查询中都有一个“按X desc排序”,并且该列未编制索引。这导致全表扫描对行进行排序,即使仅返回2也是如此。该表大约有300万行,我认为它比它可以处理得更好。 360秒连接超时!我为该列编制了索引,没有更多的“阻止”废话了,顺便说一句,这实际上是超时时返回的可怕消息。现在,如果我为where子句中出现的每一列建立索引,则查询运行良好。