C# - PostgreSQL的 - 随着时间的推移内存泄漏(C# - postgresql -

2019-10-29 18:37发布

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

我有以下的C#使用while循环不断推动数据移植到PostgreSQL数据库的代码。 我真的很挣扎,因为我不是一个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#程序员...我不是太熟悉的内存处理概念。 但我会尽我所能理解

Answer 1:

下面是一些你可以试试。 注意命令和参数的实例发生在循环之外,而不是每次迭代。

我回收的参数。 其结果是,我使用Add() ,而不是AddWithValue()您必须在第二个参数的数据库类型填写,并考虑使用过适当精度和比例参数。 如果这两个命令都使用相同的参数类型才会工作。 你可能会考虑创建两个命令,每个查询。

知道新的变量名@令我生厌为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");


文章来源: C# - postgresql - memory leak over time