简单地说,当我的服务使用它时,我的sqlservr.exe是内存泄漏。所以问题是,在哪里以及为什么! :(
我将我的连接初始化为空值。并有一个finally子句,以确保它们被关闭...(我也试过。在datareader上设置,但没有帮助)。
我已经尝试过一天以上的问题。我所能说的就是它在某处。
private Int32 GetCount(String From, String Where)
{
//Build SQL string from given parameters.
String sql = "SET dateformat DMY SELECT COUNT(*) as Count FROM " + From + " WHERE " + Where;
SqlDataReader dataCount = null;
SqlCommand sqlCommCount = null;
SqlConnection sqlConCount = null;
try
{
sqlCommCount = new SqlCommand();
sqlConCount = new SqlConnection();
sqlCommCount.Connection = sqlConCount;
sqlConCount.ConnectionString = "connectionstring";
sqlCommCount.CommandText = sql;
sqlConCount.Open();
dataCount = sqlCommCount.ExecuteReader();
while (dataCount.Read())
{
return Convert.ToInt32(dataCount["Count"]);
}
return 0;
}
finally
{
sqlConCount.Close();
sqlCommCount.Dispose();
if (dataCount != null)
dataCount.Close();
}
}
解决:
没有泄漏。
我讨厌Sqlserver没有告诉我它缓存了连接时没有使用的内存,所以只是增加和增加(直到需要它为止)。
答案 0 :(得分:2)
使用以下关键字重构您的代码:使用
内存占用不是确定性的,在你的示例中,只有当垃圾收集发生时才会释放可执行文件使用的有效内存,因此你可以看到内存增加,但这可能不是问题,它将被收集迟早和记忆将恢复到正确的值。
看到评论后,问题似乎不在你的C#代码中(如果使用using关键字,这也是个好主意!),如果有问题......
SQL Server将增加内存占用,直到它有可用内存,它的设计就是这样。在每次传递一个新的where子句时,它会缓存SQL语句,因此内存使用量会增加,直到你有可用内存为止。
在这种情况下,我建议你重构代码,至少使用SQL参数来创建where子句,这样SQL将始终保持不变,只有参数发生变化,这样SQL服务器只会缓存一个SQL语句,不是千万。更好的是创建一个存储过程,但参数通常就足够了。
请记住,构建SQL语句的方式实际上是不安全的,并且可能导致SQL注入攻击,使用参数也会解决这个问题。
此致
的Massimo
答案 1 :(得分:0)
您的Conenction sqlConCount 永远不会被处理掉。
SqlConnection的Dispose实现在处理之前关闭连接。所以最好是使用using命令进行连接,你可以确定问题不会在那里。
但是因为你不保存引用它应该是垃圾收集,所以不是真正的问题。你100%确定内存泄漏在这里吗?
答案 2 :(得分:0)
看起来你要在finally块有机会触发之前返回你的整数。尝试在try块中分配它并在finally块
之后返回它int value = o;
try
{
...
value = Convert.ToInt32(dataCount["Count"]);
}
finally
{
//close connection
}
return value;
答案 3 :(得分:-2)
我认为string + string
导致泄漏,切换到StringBuilder。您也没有处置SqlConCount
和dataCount
(您可以尝试使用using
重构代码