- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在运行 SQL 脚本并将结果转储到文件的服务程序中遇到内存泄漏问题。在运行产生许多结果行的查询后,进程的内存使用量每次都会增加 50+ MB,而且不会下降。
这是打开连接并检索结果的代码:
using (var conn = new SqlConnection(DataSourceInfo.ConnectionString))
{
conn.Open();
var scmd = new SqlCommand(query_string, conn);
scmd.CommandTimeout = 86400;
var writer = dest.GetStream(); //the writer is disposed of elsewhere
using (var da = new SqlDataAdapter(scmd))
using (var ds = new DataSet())
{
da.Fill(ds);
var table = ds.Tables[0];
var rows = table.Rows;
if (TaskInfo.IncludeColNames.Value)
{
object[] cols = new object[table.Columns.Count];
for(int i = 0; i < table.Columns.Count; i++)
cols[i] = table.Columns[i];
LineFormatter(writer, TaskInfo.FieldDelimiter, null, false, cols);
writer.WriteLine();
}
foreach(System.Data.DataRow r in rows)
{
var fields = r.ItemArray;
LineFormatter(writer, TaskInfo.FieldDelimiter, TaskInfo.TextQualifier, TaskInfo.TrimFields.Value, fields);
writer.WriteLine();
}
}
}
我使用 WinDbg 和 sos.dll 在执行完成后按类型列出排名靠前的对象,并且进程有足够的时间进行 GC:
79333470 101 166476 System.Byte[]
65245dcc 177 3897420 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
0015e680 5560 3968936 Free
79332b9c 342 3997304 System.Int32[]
6524508c 120349 7702336 System.Data.DataRow
793041d0 984 22171736 System.Object[]
7993bec4 70 63341660 System.Decimal[]
79330a00 2203630 74522604 System.String
第二列是对象数量,第三列是总大小。
不应有任何未完成的 System.Data.DataRow 对象。看起来它们正在以某种方式泄露,但我不确定是如何泄露的。
我做错了什么?
注意:以前的版本使用 SqlDataReader 来检索行数据,但该方法缺少获取列标题的方法(据我所知),并且在 DataSet 和 SqlDatReader 之间共享数据集会在某些查询中默默地失败。我不记得那个版本有内存泄漏问题。
最佳答案
除非 LineFormatter 正在做一些事情来在程序的生命周期中保留引用,否则我看不出这里有什么问题。
您正在对垃圾收集器的工作方式做出一些重大假设。 AFAIK,它基于内存压力而不是时间工作。如果您感觉真的很偏执,您可以在代码中运行 GC.Collect() 并查看这是否会降低内存使用量,但我绝不会在生产代码中调用 GC.Collect() —— 只是将其作为测试.
还要确保您没有依赖任务管理器来告诉您在 .NET 堆中保留了多少内存。您应该改为查看 performance counters in PerfMon检查托管世界中发生的事情。
关于.net - .NET SqlConnection 和 DataSet 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409987/
使用 DataSnap 2009,我似乎可以在客户端数据模块中使用远程数据库连接,使用 TDSProviderConection 和关联的 TSQLConnection。客户端很容易设置,我在表单上放
我很好奇为什么会这样。我今天早些时候遇到了这种情况 using (SqlConnection oConn = new SqlConnection(ConnectionString)) { us
我正在用 .Net Reflector 检查 SqlConnection . 我注意到有一个私有(private)构造函数,有趣的是它接受一个 SqlConnection 类作为参数。 我想知道的主要
我的问题:本周早些时候,我接到了加速我们程序中的任务的任务。我看着它,立即想到了在该任务中为函数使用并行 foreach 循环的想法。 我实现了它,通过了函数(包括所有子函数)并更改了 SqlConn
我想执行一个 SELECT 查询,然后执行一系列 UPDATE 查询(都在同一个表上); UPDATE 在重复调用的单独方法中实现。如果其中一个 UPDATE 查询失败,我希望它们全部失败/回滚 -
做什么 using (SqlConnection cn = new SqlConnection(connectionString)) 做吗? 最佳答案 new SqlConnection(connec
您好,我想问一下,创建 Singleton 以仅与 db 建立一个事件连接是否是个好主意。我想做的是: 1) 我有 wcf 服务 2)wcf服务从db获取数据 3)我想创建一个这样的单例,只有一个连接
尊敬的专业人士请帮我解决以下问题。在我的 .NET C# 应用程序中,有以下代码: SqlConnection connection = new SqlConnection( SQLCONNECTIO
我正在尝试更新一些代码。我有一个以此开头的 vb 文件... Imports System.Data.SqlClient Imports System.Data.Sql Imports System.
如果我打开一个到 SQL Server 的 SqlConnection,然后从多个后台线程发出多个查询,所有查询都使用该一个连接 - 这些查询是否会按顺序执行(不关心顺序) )? 具体来说,如果在一个
我们有一个使用 SQL Server 2008 R2 数据库的应用程序。在应用程序中,使用 SqlConnection 对象调用数据库。 此SqlConnection 对象在第一次访问时初始化一次,然
我正在尝试优化访问 SQL Server 2014 数据库的代码性能,并注意到连接池似乎并不像 ADO.NET 所宣传的那样工作。默认情况下,它应该被启用并且开箱即用(只要使用相同的连接字符串)。然而
我正在尝试使用 SqlConnection 和 SqlCommand 对象建立一个简单的 MS Access 数据库连接。 正如您在此处看到的,我是如何建立联系的: private SqlConnec
我有一个连接到数据库的 .NET 应用程序。 在我的 web.config 文件中有 用户名和密码已删除。 在我后面的代码中,我这样打开连接 protected void grabDat
SqlDataReader rdr = null; con = new SqlConnection(objUtilityDAL.ConnectionString); using (SqlCommand
public class db { public static string connectionString = WebConfigurationManager.Con
我需要你的帮助(眼睛)看看我哪里错了。 所以,我遇到了这个错误... 这是我正在做的... 一个登录用户,有一个角色,这个角色有或没有一些权限。 当他输入表单时,应用程序会根据他的角色检查用户权限。在
我不确定嵌套的 SqlConnections 是否可行,但我真的很想远离它。我现在在我的代码中遇到了一个范围问题,我正试图弄清楚如何解决它。 所以直到最近我还有一个全局 SqlConnection,它
我编写了以下代码(为简洁起见进行了删减): using (SqlConnection cn = new SqlConnection("Server=test;Database=test;User=te
我在另一台服务器上读取和写入数据到 Sql Server,因此我需要打开许多 SqlConnection,我在读取或写入完成后关闭它们,但有时我无法连接到服务器但是在我重新启动服务器后一切正常,我猜这
我是一名优秀的程序员,十分优秀!