我正在将Foxpro迁移到ASP.NET MVC应用程序。
近70%的逻辑嵌入在SqlServer存储过程中。因此我们使用一些程序来更新一些表(我们不映射SP,只使用SqlDataReader,SqlCommand,SqlAddapter调用它们。)
问题是每次通话都会打开很多连接。即使这样,每次通话都会关闭连接。当运行sp_who时,似乎为同一用户打开了许多连接。
当前关闭和处理每个连接的方式是什么?
可以找到活动连接并重复使用吗?
最后一次尝试是:
SqlConnection.ClearAllpools();
但它不会立即生效。 我们有一个执行连接的IDisposabel类连接。 这是一种近距离的方法:
public void close()
{
SqlConnection.ClearAllPools();
//.ClearPool(BdTransCx);
// SqlConnection.ClearPool(BdArchCx);
if (ConectarArchivos)
{
if (BdArchCx.State == ConnectionState.Open)
{
BdArchCx.Close();
}
}
if (BdArchCx.State == ConnectionState.Open)
{
BdTransCx.Close();
}
}
在每个请求之后调用此方法。
答案 0 :(得分:2)
You should wrap your SqlConnection
objects, and any SqlCommand
objects in a using
block
using (SqlConnection cn = new SqlConnection(connectionString))
{
using (SqlCommand cm = new SqlCommand(commandString, cn))
{
cn.Open();
cm.ExecuteNonQuery();
}
}
有关详细信息,请参阅"Your Friend the C# Using Statement."
答案 1 :(得分:2)
.NET中的连接是合并的,因此看到一些在数据库中仍处于活动状态的连接是正常的。
你不应该试图杀死连接池,这只会破坏性能。存在池的原因是,重用连接的速度很多比每次建立新连接更快。
只需确保正确关闭每个连接和每个命令,以便将它们返回到池中。您可以使用using
块来确保无论发生什么情况都能正确处理它们:
using (SqlConnection connenction = ...) {
using (SqlCommand command = ...) {
...
}
}
答案 2 :(得分:1)
确保将Reader同时保留在using语句中以避免连接问题
using (SqlConnection cn = new SqlConnection(connectionString))
{
using (SqlCommand cm = new SqlCommand(commandString, cn))
{
cn.Open();
using (IDataReader dr = cm.ExecuteReader())
{
}
}
}