C#-postgresql-随时间推移发生内存泄漏

时间:2018-08-18 18:41:36

标签: c# postgresql memory memory-management memory-leaks

问题:随着时间的流逝,内存泄漏(累积),最终达到99%的容量。

我有以下C#代码,它们使用while循环不断将数据推入PostgreSQL DB。我真的很挣扎,因为我不是C#程序员。我的主要语言是Python。我一直在尝试查找C#引用来解决我的问题,但是由于失败,我根本不了解很多语法。 C#代码是由我公司中的其他人编写的,但他现在不可用。

代码如下:

var connString = "Host=x.x.x.x;Port=5432;Username=postgres;Password=password;Database=database";

using (var conn = new Npgsql.NpgsqlConnection(connString)){

    conn.Open();

    int ctr = 0;

    // Insert some data
    while(@tag.TerminateTimeScaleLoop == 100)
    {
        @Info.Trace("Pushed Data: PostGre A " + ctr.ToString());
        using (var cmd = new Npgsql.NpgsqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO TORQX VALUES (@r,@p)";
            cmd.Parameters.AddWithValue("r", System.DateTime.Now.ToUniversalTime());
            cmd.Parameters.AddWithValue("p", @Tag.RigData.Time.TORQX);
            cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();


            cmd.CommandText = "INSERT INTO BLKPOS VALUES (@s,@t)";
            cmd.Parameters.AddWithValue("s", System.DateTime.Now.ToUniversalTime());
            cmd.Parameters.AddWithValue("t", @Tag.RigData.Time.BLKPOS);
            cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();



           // @Info.Trace("Pushed Data: PostGre " + ctr.ToString());
        }

        ctr = ctr + 1;
    }
    @Info.Trace("Pushed Data: PostGre A Terminated");

该代码从一开始就成功建立了连接,并且在整个过程中仅使用一个连接。它将数据正确插入数据库。但是在内存容量达到99%之后,其插入效果不是很好。我可以想到的问题根源是,这段代码不断创建新的对象,但是在完成一次迭代后并没有清除该对象。谁能告诉我问题的根源在哪里并提供解决方案?

++,请理解我不是C#程序员...我对内存处理的概念不太熟悉。但我会尽力了解

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法。请注意,命令和参数的实例化发生在循环之外,而不是在每次迭代时发生。

我正在回收参数。结果,我使用的是Add(),而不是AddWithValue(),因此您必须填写第二个参数的数据库类型,并考虑适当地使用precision和scale参数。 仅当两个命令使用相同的参数类型时,此方法才有效。您可能会考虑创建两个命令,每个查询一个。

知道以@开头的变量名称使我不胜任C#开发人员。...

var connString = "Host=x.x.x.x;Port=5432;Username=postgres;Password=password;Database=database";

using (var conn = new Npgsql.NpgsqlConnection(connString))
{
    conn.Open();

    int ctr = 0;

    @Info.Trace("Pushed Data: PostGre A " + ctr.ToString());

    using (var cmd = new Npgsql.NpgsqlCommand())
    {
        cmd.Connection = conn;

        var par_1 = cmd.Parameters.Add("@p1", /*< appropriate datatype here >*/);
        var par_2 = cmd.Parameters.Add("@p2", /*< appropriate datatype here >*/);

        while(@tag.TerminateTimeScaleLoop == 100)
        {
            cmd.CommandText = "INSERT INTO TORQX VALUES (@p1,@p2)";
            par_1.Value = System.DateTime.Now.ToUniversalTime());
            par_2.Value = @Tag.RigData.Time.TORQX;

            cmd.ExecuteNonQuery();

            cmd.CommandText = "INSERT INTO BLKPOS VALUES (@p1,@p2)";

            par_1.Value = System.DateTime.Now.ToUniversalTime());
            par_2.Value = @Tag.RigData.Time.BLKPOS;

            cmd.ExecuteNonQuery();

            ctr = ctr + 1;
        }
    }
}
@Info.Trace("Pushed Data: PostGre A Terminated");