我最近刚刚了解到这种连接池机制,并发现我编写的SQL连接错误。我曾经维护一个全局SQL连接,所有SqlCommands
都将执行。
所以我现在正在对现有代码进行大规模更改。参与全球SqlCommands
的{{1}}不少于260 SqlConnection
我现在正在忙着
using (SqlConnection sqlConnection = new SqlConnection(globally_stored_connection_string))
{
sqlConnection.Open();
// SqlCommand comes here
}
我认为它仍然是我必须做出的一种范式转换,这种关闭连接的业务只是在不久之后开启一个新的连接,信任连接池来处理开销。考虑到这一点,我现在需要决定如何在循环内多次调用SqlCommands
。非常感谢您对以下哪些代码段的首选(当然,我的SqlCommands
还有更多内容,而不仅仅是这些,但这些是用来说明问题的简单示例)。
选项A:
using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
foreach(int number in numberList)
{
using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
{
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
}
}
}
选项B:
foreach (int number in numberList)
{
using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
}
}
答案 0 :(得分:7)
我认为你缺少选项C,这对我来说最有意义:
using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
{
foreach (int number in numberList)
{
//Modify command parameters if needed
sqlCommand.ExecuteNonQuery();
}
}
}
执行命令的开销最小。构造SqlCommand
对象不是非常昂贵,但它也不是免费的。如果可能的话,我们可以在这里重复使用它。
答案 1 :(得分:1)
我会去
using (SqlConnection sqlConnection = new SqlConnection(connection_string))
{
sqlConnection.Open();
foreach(int number in numberList)
{
using (SqlCommand sqlCommand = new SqlCommand("SQL code here using number from foreach loop", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
}
}
您只需在此代码块中打开一次连接。
尽管在完成连接后立即关闭连接是很好的,但您不必将其置于极端并为每个事务打开连接。如果您一个接一个地执行几个命令,就足以打开它一次。即使使用连接池,打开新连接也会产生一些开销。如果你不把它留在那么那就足够了。