Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和SQL Server SqlConnection的使用导致内存泄漏_C#_Sql Server 2008_Memory Leaks_Garbage Collection_Database Connection - Fatal编程技术网

C#和SQL Server SqlConnection的使用导致内存泄漏

C#和SQL Server SqlConnection的使用导致内存泄漏,c#,sql-server-2008,memory-leaks,garbage-collection,database-connection,C#,Sql Server 2008,Memory Leaks,Garbage Collection,Database Connection,我们的C#应用程序内存严重泄漏。我们隔离了所有可能的嫌疑犯,发现导致内存泄漏的数据层--SqlConnection。我们正在执行许多SqlConnection请求。大约每秒10个请求。我们每天都有200米的泄漏 我们使用以下SqlConnectionaccess作为基类: public class Access : IDisposable { protected SqlConnection connection; private readonly object locker =

我们的C#应用程序内存严重泄漏。我们隔离了所有可能的嫌疑犯,发现导致内存泄漏的数据层--
SqlConnection
。我们正在执行许多
SqlConnection
请求。大约每秒10个请求。我们每天都有200米的泄漏

我们使用以下
SqlConnection
access作为基类:

public class Access : IDisposable
{
    protected SqlConnection connection;

    private readonly object locker = new object();

    protected void OpenConnection()
    {
        if (this.connection == null)
        {
            lock (locker)
            {
                if (this.connection == null)
                {
                    string conn = Config.Data["data"]["mainConnString"];
                    this.connection = new SqlConnection(conn);
                    this.connection.Open();
                }
            }
        }
        else if (this.connection.State == System.Data.ConnectionState.Closed)
        {
            lock (locker)
            {
                if (this.connection.State == System.Data.ConnectionState.Closed)
                {
                    this.connection.Open();
                }
            }
        }
    }

    public void Dispose()
    {
        if (this.connection != null)
        {
            this.connection.Close();
            this.connection.Dispose();
        }
    }
}
我们所有的
SqlConnection
类都继承自上面的这个基类,我们用
using
块围绕每个
SqlConnection
用法

例如,如果我们有一个
Product
表和一个
ProductAccess
表,则继承
Access

我们正在使用以下代码:

using (var acceess = new ProductAccess ())
{
    Product product = acceess .GetProductById (id);
}
因此,每次使用
SqlConnection
时,我们都会创建一个新的连接,并在使用完它之后处理它(因为用法被
using
block包围)

我们正在使用c#v4.0.30319和Microsoft SQL Server 2008 R2

有人知道或者知道为什么会发生内存泄漏吗

可能与垃圾收集问题或垃圾收集配置有关

可能此泄漏与
GC.SuppressFinalize(this)
方法调用
SqlConnection
dispose()
方法调用有关


谢谢

几年前我遇到了这个问题。我意识到这是关于连接池的。正如上面所说:

“连接池减少了必须打开新连接的次数。池程序维护物理连接的所有权。它通过为每个给定连接配置保持一组活动连接的活动状态来管理连接。”


您可以在连接关闭后清除池(沉重且低效),也可以通过尝试并出错将连接字符串中的
最小池大小
最大池大小
设置为最佳值。我相信在您的情况下,调整
最大池大小
要重要得多。试着减少它并观察结果。最好从最小值和最大值=1开始测试;虽然这可能会损害性能。我希望这会有所帮助。

谢谢,我会检查是否将“最大池大小”属性添加到连接字符串中,以解决此问题。请稍后报告。我很好奇,就像你没有修补漏洞一样。我认为泄漏与垃圾收集问题有关,我们看到泄漏是由非托管资源引起的(通过使用c#ANTS性能分析器发现)。还有其他修复漏洞的建议吗?@user2456342您的代码中是否使用了非托管资源?如果是这样,您是否编写任何终结器来释放资源?