Datatable内存释放不彻底问题?

zwz19920209 2015-08-18 04:19:16
 private void Get_tbl_Result(string tablename, string objectid, string counterlist, int omcid, SqlConnection localconn)
{
DataTable tableData = new DataTable();
tableData.TableName = tablename;

bool ret = false;
//组合出SQL

string sql = "";


sql = sql + " select a.NeFdn,a.ObjectMember0," + counterlist + ",'" + OmcDatetimeStr + "' as scantime";
sql = sql + " from tbl_ObjectInstance a, " + tablename + " b ";
sql = sql + " where a.ObjectTypeId=" + objectid;
sql = sql + " and (a.InvalidTime is NULL or a.InvalidTime>EndTime) and b.ObjectNo=a.ObjectNo";
sql = sql + " and b.ObjectNo=a.ObjectNo";
sql = sql + " and b.StartTime='" + OmcDatetimeStr + "'";

//执行SQL
AseCommand command;
AseConnection pmconn1 = new AseConnection(PmConnstr_1_1); ;
if (pmconn1.State == ConnectionState.Closed)
pmconn1.Open();
command = new AseCommand(sql, pmconn1);
command.CommandTimeout = 60*1000;
AseDataAdapter da = new AseDataAdapter(command);
try
{

da.Fill(tableData);

WritePmData_table(tableData, localconn);
tableData.Clear();
tableData.Dispose();
tableData = null;

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
ret = true;
}
catch (Exception ex)
{
writeerror(tablename + "出错:" + ex.Message + ";" + sql);
ret = false;
}
if (pmconn1.State == ConnectionState.Open)
pmconn1.Close();
pmconn1.Dispose();
command.Dispose();
da.Dispose();
}


主要是从数据库中读数据放到datatable中,然后将datatable的数据再存入数据库中。这个函数每个小时会有一轮掉用,每轮调用10几次,每次数据量在几万到十几万不等。没次调用时内存会一直涨然调用完后内存会降,但没法降到调用之前那样。每个小时内存都会多两百兆,几个小时后就内存溢出了。从任务管理器看,第一个小时取完数据后内存占用是两百兆,第二个小时取完数据后,内存占用就变成了400多兆,就这么一直涨,知道内存溢出。
求各位大神看看为什么会这样啊。
...全文
1292 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwz19920209 2015-08-20
  • 打赏
  • 举报
回复
问题解决了,的确不是datatable问题,应该是这个函数调用太频繁,然后 //执行SQL AseCommand command; AseConnection pmconn1 = new AseConnection(PmConnstr_1_1); 这new 的太频繁导致的。谢谢
zwz19920209 2015-08-18
  • 打赏
  • 举报
回复

		if (this.dt_ObjType_BSC6000.Rows.Count == 0)
		{
			this.writelog("初始数据采集");
         
                    this.GetPMData(PmConnstr_1, 1);//就这一个有问题,另外两个没问题,只是数据库连接串不同
                    this.GetPMData(PmConnstr_2,3);
                    this.GetPMData(PmConnstr_3, 4);
                  
				}
zwz19920209 2015-08-18
  • 打赏
  • 举报
回复
从三个数据库数取数据用的是一个方法,连sql都一样的。只是数据库连接串不一样。
ajianchina 2015-08-18
  • 打赏
  • 举报
回复
刚刚少打了,重复的new出新对象就出造成这样的问题,还有你的计时器选择也很重要。
ajianchina 2015-08-18
  • 打赏
  • 举报
回复
问题不在你放出这组代码里,你要检查你的计时器使用方法,重复的new出就出造成这样的问题 原先如果是这样的: void 方法() { System.Threading.Timer timer = new System.Threading.Timer(xxxx, null, 0, 123); } 换成这样: System.Threading.Timer timer; void 方法() { timer = new System.Threading.Timer(xxxx, null, 0, 123); }
於黾 2015-08-18
  • 打赏
  • 举报
回复
还有,你应该将连接数据库,取数据的方法抽出来,封装一个方法 另外3个方法只不过是传入不同的连接串和不同的SQL语句罢了 不要写3个完全不同的方法去连接数据库,那样很容易漏掉什么代码
於黾 2015-08-18
  • 打赏
  • 举报
回复
既然你分别取了3次 那么是用同一个方法取的,还是分别写了3个方法? 仔细检查取那个数据库的方法,什么东西没有释放 既然取另外2个数据库的数据好使,说明跟DataTable本身没有一毛钱关系
zwz19920209 2015-08-18
  • 打赏
  • 举报
回复
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();这个代码原本没有的,只是有内存溢出问题,写上去试试能不能解决问题 但整个项目会从三个数据库取数据放到datatable中,只是程序会一个取完换个连接串在取。代码都一样的。但只有取其中一个数据库的数据时会造成内存溢出,三个数据库的表都一样的,只是数据不同,造成内存溢出的那个数据库数据量比其他两个大一点。
於黾 2015-08-18
  • 打赏
  • 举报
回复
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 这些都是坑爹的代码.GC会在几秒钟之内清理没有引用的对象,而你即使显式的调用GC,也不过是通知GC可以马上清理了,至于它到底清理什么,不清理什么,你还是没法控制.而且频繁的调用GC反而加重CPU的负担. DataTable是托管资源,不存在内存释放不彻底的问题. 所以你总是在DataTable身上找原因,那是缘木求鱼了 你应该果断放弃这个想法,转而找找程序里还有什么东西没有释放,比如数据库连接

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧