SQL Server和.NET内存的限制,分配和垃圾收集(SQL server and .NET m

2019-10-16 18:03发布

我运行的.NET 3.5(C#)和SQL Server 2005(为客户)。 我们运行的代码做一些回归数学和有点复杂。 我收到以下错误,当我运行在我们网站上的多个页面:

.NET Framework execution was aborted by escalation policy because of out of memory. 
System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
System.InvalidOperationException: 

我试图弄清楚什么是这样做的根本原因:这是一个数据库的问题还是我的C代码##? 或者是它运行查询时并发有锁吗? 还是别的什么别的吗?

该代码是示数在这里:

erver.ScriptTimeout = 300;
        string returnCode = string.Empty;
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainDll"].ToString())) {
            connection.Open();
            using (SqlCommand command = new SqlCommand(sql.ToString(), connection)) {
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 300;
                returnCode = (string)command.ExecuteScalar();
                //Dispose();
            }
            //Dispose();
        }

我们的承包商写了一堆代码,以帮助在App_Code文件/文件sqlHelper.s SQL连接。 他们中有些人是这样的:

public static SqlDataReader GetDataReader(string sql, string connectionString, int connectionTime) {
        lock (_lock) {
            SqlConnection connection = null;
            try {
                connection = GetConnection(connectionString);
                //connection.Open();
                using (SqlCommand cmd = new SqlCommand(sql, connection)) {
                    cmd.CommandTimeout = connectionTime;
                    WriteDebugInfo("GetDataReader", sql);
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
            }
            catch (Exception e) {
                if (connection != null)
                    connection.Dispose();
                throw new DataException(sql, connectionString, e);
            }

        }
    }

如果有一些内存释放的地方?

Answer 1:

问题是,由于某种原因,你的DataReader没有被关闭。 一个例外? 该方法的用户不记得要关闭DataReader?

返回一个DataReader它的身体外使用的函数离开它关闭到外码的责任,所以没有保证,读者将被关闭。 如果您不关闭的读者,你不能重用在其被打开的连接。

所以,从函数返回一个DataReader是一个非常糟糕的主意!

你可以看到有关此话题的整个讨论在这里 。

查找此功能(的用途GetDataReader ),并检查是否有保证,读者越来越封闭。 而且,最重要的是,有没有可能该代码重新进入并使用相同的收集首先是关闭之前打开一个新的DataReader。 (不要被CommandBehavior.CloseConnection被误导。这只需要在DataReader关闭关闭连接的关怀......只有当你不失败将其关闭)



Answer 2:

这是因为你的数据读取器已经被填充。​​它总是一个更好的方式来释放数据读取器,指挥,数据集,数据表并关闭在finally块的连接。 使用的Dispose()和close()方法。



文章来源: SQL server and .NET memory constraints, allocations, and garbage collection