ajax调用Webservice后,内存一直在增加,没释放。 本帖最后由 wangan2008 于 2012-09-25 14:34:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 jq调用webservie分页。iis上,w3wp.exe 内存22.926k。点下一页,内存始终在慢慢上涨,每次点击涨0.016-0.200k范围。= =因为PV比较高。多次点击= =内存很快就涨得很大了。 貌似 每个请求都会生成Web服务类的新实例。所以内存会上涨 public class WebService1 : System.Web.Services.WebService{ public static SqlConnection sqlConnection ; static WebService1() { sqlConnection = ... } [WebMethod] public string HelloWorld() { }}静态的构造函数 才能保证SqlConnection 被共享 = =不太理解你的意思。是指SqlConnection必须要申明静态吗》?还有 生成Web服务类的新实例 怎么释放这个实例呢??? 即使调用了objDataSet.Dispose();内存也不会立即回收的,内存中存在一定数量的垃圾之后.net 框架会回收,可以尝试GC.Collect()看看内存少了没 将要用的数据库操作 作为静态服务,这样每次请求就不会创建新事例了。具体把那些放在这个服务里就要看你需求了。public static SqlConnection sqlConnection ;static WebService1(){sqlConnection = ...}这只是个例子 DataColumn myDataColumn = new DataColumn(); myDataColumn.DataType = rdr.GetFieldType(i); myDataColumn.ColumnName = rdr.GetName(i); datatable.Columns.Add(myDataColumn);可能是和这个反射有关系 = =改成下面的,保留using,去掉con.close后,稍微好了点。。但内存还是在涨啊。public static DataTable ExecuteReaderfhz(string connectionString, CommandType cmdType, string cmdText, out string ww, out string yy, params SqlParameter[] commandParameters) { using (SqlConnection sqlConnection = new SqlConnection(connectionString)) { using (SqlCommand cmd = new SqlCommand()) { PrepareCommand(cmd, sqlConnection, 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; } rdr.Close(); ww = commandParameters[8].Value.ToString(); yy = commandParameters[9].Value.ToString(); cmd.Parameters.Clear(); return datatable; } } } } } 这个很奇怪的说,用下面代码读取datareader能到datatable能取数据,但是都会少第一条数据,不知道为什么。所以改成你引用的那条代码。if (rdr != null && rdr.HasRows && rdr.Read())datatable.Load(rdr); 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; } rdr.Close(); ww = commandParameters[8].Value.ToString(); yy = commandParameters[9].Value.ToString(); cmd.Parameters.Clear(); return datatable; } }一、先不要用 datareader;二、去掉反射;三、避免在循环内反复的生成对象,就算一个对象只有几十个字节。 再就是内存,LZ可以先分辨下是IIS的内存?还是IE的内存?或者是数据库的内存?在上涨 因为内存不断上涨,占用不释放,所以,把本来用dataset赋给datatable的,换成datareader赋给datatable试试。结果内存问题依旧。刚才去掉反射,但没什么变化。嗯,谢谢,我先试试。 唉。。放iis上用着用着就 Server Application Unavailable 了 把使用完的datatable 直接赋值为 null 那? 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; } http://support.microsoft.com/kb/919790 如何使用 IIS 调试诊断工具来解决对 IIS 进程中的存在内存泄漏 rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。 rdr。close要手动关闭,不然无法取得 sql返回值。 这样的代码我看到过,那人为了保险,对连接和数据源对象多次调用Close,Dispose,导致连接数和内存暴增。我没仔细看你代码中的逻辑,如果rdr.Close无法去掉,那就去掉对等的using。 +1using和Close、Dispose只选一个 谢谢,我试试哦。比如:System.Web.Services.WebService 里面返回值我申明一个全局string,再方法里给它赋值,然后让它返回。会不会有并发高时导致的问题呢? 楼主干嘛 不直接 用 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(); 一次 多少会影响内存的 datatable.Load读取的话,会少第一条数据,不知道什么原因。然后,和这个关系不大。datareader换成dataset内存问题依旧。 你是说 if (rdr != null && rdr.HasRows && rdr.Read()) datatable.Load(rdr);这里会少第一条数据吗?那是因为 你 if(rdr != null && rdr.HasRows && rdr.Read()) 判断的时候 用了rdr.Read() 已经读取了一次 using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataSet ds = new DataSet(); // 填充DataSet. da.Fill(ds); return ds; } 没必要使用 SqlDataReader 参考:http://www.cnblogs.com/eaglet/archive/2009/10/14/1582928.htmlNewRow()方法引起的 求救,asp.net一调试就报错误。 改变iframe的src aspnetpager结合repeater 在三层中实现分页~~急 Eval 怎样格式化显示日期? HTML元素里有没有类似label控件的.或可代替的 充值成功后得页面加个继续充值的功能。要怎么做啊。。。~~ 关于web.conf的配置出错,应该怎么配置? XML添加结点问题. 在程序中用代码添加控件LinkButton,怎么让事件触发? 如何单击gridview中单元格实现编辑功能,单纯的改变它的文本 地址栏参数中包含 < > % 的问题 在后台.cs文件怎样设置前台table的背景色和只读属性
iis上,w3wp.exe 内存22.926k。
点下一页,内存始终在慢慢上涨,每次点击涨0.016-0.200k范围。
= =因为PV比较高。多次点击= =内存很快就涨得很大了。
{ public static SqlConnection sqlConnection ; static WebService1()
{
sqlConnection = ...
} [WebMethod]
public string HelloWorld()
{
}
}静态的构造函数 才能保证SqlConnection 被共享
还有 生成Web服务类的新实例 怎么释放这个实例呢???
内存也不会立即回收的,内存中存在一定数量的垃圾之后
.net 框架会回收,
可以尝试GC.Collect()看看内存少了没
将要用的数据库操作 作为静态服务,这样每次请求就不会创建新事例了。具体把那些放在这个服务里就要看你需求了。
public static SqlConnection sqlConnection ;static WebService1()
{
sqlConnection = ...
}
这只是个例子
myDataColumn.DataType = rdr.GetFieldType(i);
myDataColumn.ColumnName = rdr.GetName(i);
datatable.Columns.Add(myDataColumn);
可能是和这个反射有关系
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand())
{
PrepareCommand(cmd, sqlConnection, 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;
} rdr.Close();
ww = commandParameters[8].Value.ToString();
yy = commandParameters[9].Value.ToString(); cmd.Parameters.Clear();
return datatable;
}
}
}
}
}
所以改成你引用的那条代码。if (rdr != null && rdr.HasRows && rdr.Read())
datatable.Load(rdr);
{
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;
} rdr.Close();
ww = commandParameters[8].Value.ToString();
yy = commandParameters[9].Value.ToString(); cmd.Parameters.Clear();
return datatable;
}
}一、先不要用 datareader;
二、去掉反射;
三、避免在循环内反复的生成对象,就算一个对象只有几十个字节。
所以,把本来用dataset赋给datatable的,换成datareader赋给datatable试试。
结果内存问题依旧。
刚才去掉反射,但没什么变化。嗯,谢谢,我先试试。
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;
}
using和Close、Dispose只选一个
我申明一个全局string,再方法里给它赋值,然后让它返回。会不会有并发高时导致的问题呢?
{
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(); 一次 多少会影响内存的
datatable.Load读取的话,会少第一条数据,不知道什么原因。然后,和这个关系不大。datareader换成dataset内存问题依旧。
datatable.Load(rdr);
这里会少第一条数据吗?
那是因为 你 if(rdr != null && rdr.HasRows && rdr.Read()) 判断的时候 用了rdr.Read() 已经读取了一次
{
DataSet ds = new DataSet();
// 填充DataSet.
da.Fill(ds);
return ds;
} 没必要使用 SqlDataReader
NewRow()方法引起的