问题:随着时间的流逝,内存泄漏(累积),最终达到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#程序员...我对内存处理的概念不太熟悉。但我会尽力了解
答案 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");