ajax调用Webservice后,内存一直在增加,没释放。

wangan2008 2012-09-25 02:26:51
Webservice代码如下,很简单的流程。
1、数据库连接及时关闭。
2、都using并且Dispose了。
请问是什么原因哦????
导致内存没有被释放呢????
会是因为静态方法的原因吗???

using (DataTable objDataSet = w_system.GetTypeListc(tables, zd, id, where, desc, pxid, mypage, page.ToString(), out cc, out dd))
{

for (int i = 0, pagezs = objDataSet.Rows.Count; i < pagezs; i++)
{
生成html表格数据
}

objDataSet.Clear();
objDataSet.Dispose();
return t;
}

w_system.GetTypeListc方法

public static DataTable GetTypeListc(string tables, string zd, string id, string where, string desc, string pxid, string mypage, string page, out string aa, out string bb)//分页
{
string strDataset = "exec sp_ys_PageTable @tables,@zd,@id,@where,@desc,@pxid,0,@mypage,@page,@TotalCount OUTPUT,@TotalPageCount OUTPUT";
aa = null;
bb = null;
SqlParameter[] parms = new SqlParameter[]
{
new SqlParameter("@tables",SqlDbType.VarChar),
new SqlParameter("@zd",SqlDbType.VarChar),
new SqlParameter("@id",SqlDbType.VarChar),
new SqlParameter("@where",SqlDbType.VarChar),
new SqlParameter("@desc",SqlDbType.VarChar),
new SqlParameter("@pxid",SqlDbType.Int),
new SqlParameter("@mypage",SqlDbType.Int),
new SqlParameter("@page",SqlDbType.Int),
new SqlParameter("@TotalCount",SqlDbType.Int),
new SqlParameter("@TotalPageCount",SqlDbType.Int)
};

parms[0].Value = tables;
parms[1].Value = zd;
parms[2].Value = id;
parms[3].Value = where;
parms[4].Value = desc;
parms[5].Value = Int32.Parse(pxid);
parms[6].Value = Int32.Parse(mypage);
parms[7].Value = Int32.Parse(page);
parms[8].Value = 0;
parms[8].Direction = ParameterDirection.Output;
parms[9].Value = 0;
parms[9].Direction = ParameterDirection.Output;

string ww = "0", yy = "0";
using (DataTable datatable = w_SqlHelper.ExecuteReaderfhz(w_SqlHelper.strConn, CommandType.Text, strDataset, out ww, out yy, parms))
{
aa = ww;
bb = yy;

return datatable;
}
}

w_SqlHelper.ExecuteReaderfhz方法

public static DataTable ExecuteReaderfhz(string connectionString, CommandType cmdType, string cmdText, out string ww, out string yy, params SqlParameter[] commandParameters)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
try
{
using (SqlCommand cmd = new SqlCommand())
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{

using (DataTable datatable = new DataTable())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = rdr.GetFieldType(i);
myDataColumn.ColumnName = rdr.GetName(i);
datatable.Columns.Add(myDataColumn);
}
while (rdr.Read())
{
DataRow myDataRow = datatable.NewRow();
for (int i = 0; i < rdr.FieldCount; i++)
{
myDataRow[i] = rdr[i].ToString();
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}

//if (rdr != null && rdr.HasRows && rdr.Read())
// datatable.Load(rdr);


rdr.Close();
rdr.Dispose();
ww = commandParameters[8].Value.ToString();
yy = commandParameters[9].Value.ToString();

cmd.Parameters.Clear();
conn.Close();
return datatable;
}
}
}
}
catch
{
conn.Close();
throw;
}
}
}
...全文
700 43 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
参考:http://www.cnblogs.com/eaglet/archive/2009/10/14/1582928.html NewRow()方法引起的
笨笨熊三号 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]

引用 35 楼 的回复:
引用 33 楼 的回复:
rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。

rdr。close要手动关闭,不然无法取得 sql返回值。

这样的代码我看到过,那人为了保险,对连接和数据源对象多次调用Close,Dispose,导致连接数和内存暴增。我没仔细看你代码中的逻辑,如果rdr.Close无法去掉,那就去……
[/Quote]
+1
using和Close、Dispose只选一个
lizhibin11 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 的回复:]
引用 33 楼 的回复:
rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。

rdr。close要手动关闭,不然无法取得 sql返回值。
[/Quote]
这样的代码我看到过,那人为了保险,对连接和数据源对象多次调用Close,Dispose,导致连接数和内存暴增。我没仔细看你代码中的逻辑,如果rdr.Close无法去掉,那就去掉对等的using。
wangan2008 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]
rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。
[/Quote]
rdr。close要手动关闭,不然无法取得 sql返回值。
booth.chen 2012-09-29
  • 打赏
  • 举报
回复
    using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
{
DataSet ds = new DataSet();
// 填充DataSet.
da.Fill(ds);
return ds;
}


没必要使用 SqlDataReader
booth.chen 2012-09-29
  • 打赏
  • 举报
回复
你是说
if (rdr != null && rdr.HasRows && rdr.Read())
datatable.Load(rdr);

这里会少第一条数据吗?
那是因为 你 if(rdr != null && rdr.HasRows && rdr.Read()) 判断的时候 用了rdr.Read() 已经读取了一次
wangan2008 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]
楼主干嘛 不直接 用 DataSet SqlDatadapter

C# code


using (DataTable datatable = new DataTable())
{
for (int i = 0; i < rdr.FieldCount; i++)
……
[/Quote]

datatable.Load读取的话,会少第一条数据,不知道什么原因。然后,和这个关系不大。datareader换成dataset内存问题依旧。
booth.chen 2012-09-29
  • 打赏
  • 举报
回复
楼主干嘛 不直接 用 DataSet SqlDatadapter

using (DataTable datatable = new DataTable())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = rdr.GetFieldType(i);
myDataColumn.ColumnName = rdr.GetName(i);
datatable.Columns.Add(myDataColumn);
}
while (rdr.Read())
{
DataRow myDataRow = datatable.NewRow();
for (int i = 0; i < rdr.FieldCount; i++)
{
myDataRow[i] = rdr[i].ToString();
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}

这样写有什么特殊的意义吗? 还有你没每读取一行数据 都声明 DataRow myDataRow = datatable.NewRow(); 一次 多少会影响内存的


wangan2008 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]
引用 35 楼 的回复:
引用 33 楼 的回复:
rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。

rdr。close要手动关闭,不然无法取得 sql返回值。

这样的代码我看到过,那人为了保险,对连接和数据源对象多次调用Close,Dispose,导致连接数和内存暴增。我没仔细看你代码中的逻辑,如果rdr.Close无法去掉,那就去掉对……
[/Quote]
谢谢,我试试哦。

比如:System.Web.Services.WebService 里面返回值
我申明一个全局string,再方法里给它赋值,然后让它返回。会不会有并发高时导致的问题呢?
just_onece 2012-09-28
  • 打赏
  • 举报
回复
学习了
lizhibin11 2012-09-28
  • 打赏
  • 举报
回复
rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。
wfoegl 2012-09-28
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/919790 如何使用 IIS 调试诊断工具来解决对 IIS 进程中的存在内存泄漏
wangan2008 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 的回复:]
using (DataTable objDataSet = w_system.GetTypeListc(tables, zd, id, where, desc, pxid, mypage, page.ToString(), out cc, out dd))
{

for (int i = 0, pagezs = objDataSet.Rows.Count; i < pagezs;……
[/Quote]
这个试过了,效果不大,内存还是在涨。
垃圾收集器的触发时间不定。网站点击量高的话。很难等到回收。
wfoegl 2012-09-28
  • 打赏
  • 举报
回复

using (DataTable objDataSet = w_system.GetTypeListc(tables, zd, id, where, desc, pxid, mypage, page.ToString(), out cc, out dd))
{

for (int i = 0, pagezs = objDataSet.Rows.Count; i < pagezs; i++)
{
生成html表格数据
}


//这样据说垃圾收集器就会将实例objDataSet所占用的内存空间回收掉
objDataSet =null;
return t;
}

anxiyang 2012-09-28
  • 打赏
  • 举报
回复
其实 我没看懂
wfoegl 2012-09-28
  • 打赏
  • 举报
回复
把使用完的datatable 直接赋值为 null 那?
wangan2008 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
内存会一直增加,过再长的时间都不会释放么?
可能是没有超过超时时间
[/Quote]
内存释放,超时时间?
是设置在配置文件里的吗???
内容是些什么哦?
  • 打赏
  • 举报
回复
内存会一直增加,过再长的时间都不会释放么?
可能是没有超过超时时间
wangan2008 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]
再就是内存,LZ可以先分辨下是IIS的内存?还是IE的内存?或者是数据库的内存?在上涨
[/Quote]
iis的内存。
wangan2008 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
using (DataTable datatable = new DataTable())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
DataColumn……
[/Quote]
因为内存不断上涨,占用不释放,
所以,把本来用dataset赋给datatable的,换成datareader赋给datatable试试。
结果内存问题依旧。
刚才去掉反射,但没什么变化。

嗯,谢谢,我先试试。
加载更多回复(22)

62,248

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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