本帖最后由 wangan2008 于 2012-09-25 14:34:09 编辑

解决方案 »

  1.   

    jq调用webservie分页。
    iis上,w3wp.exe 内存22.926k。
    点下一页,内存始终在慢慢上涨,每次点击涨0.016-0.200k范围。
    = =因为PV比较高。多次点击= =内存很快就涨得很大了。
      

  2.   

    貌似  每个请求都会生成Web服务类的新实例。所以内存会上涨
      

  3.   

    public class WebService1 : System.Web.Services.WebService
    {    public static SqlConnection sqlConnection ;    static WebService1()
        {
            sqlConnection = ...
        }    [WebMethod]
        public string HelloWorld()
        {
            
        }
    }静态的构造函数 才能保证SqlConnection 被共享
      

  4.   

    = =不太理解你的意思。是指SqlConnection必须要申明静态吗》?
    还有 生成Web服务类的新实例 怎么释放这个实例呢???
      

  5.   

    即使调用了objDataSet.Dispose();
    内存也不会立即回收的,内存中存在一定数量的垃圾之后
    .net 框架会回收,
    可以尝试GC.Collect()看看内存少了没
      

  6.   


    将要用的数据库操作 作为静态服务,这样每次请求就不会创建新事例了。具体把那些放在这个服务里就要看你需求了。
    public static SqlConnection sqlConnection ;static WebService1()
    {
    sqlConnection = ...
    }
    这只是个例子
      

  7.   

    DataColumn myDataColumn = new DataColumn();
                                    myDataColumn.DataType = rdr.GetFieldType(i);
                                    myDataColumn.ColumnName = rdr.GetName(i);
                                    datatable.Columns.Add(myDataColumn);
    可能是和这个反射有关系
      

  8.   

    = =改成下面的,保留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;
                        }
                    }
                }
            }
        }
      

  9.   

    这个很奇怪的说,用下面代码读取datareader能到datatable能取数据,但是都会少第一条数据,不知道为什么。
    所以改成你引用的那条代码。if (rdr != null && rdr.HasRows && rdr.Read())
    datatable.Load(rdr);
      

  10.   

     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;
    二、去掉反射;
    三、避免在循环内反复的生成对象,就算一个对象只有几十个字节。
      

  11.   

    再就是内存,LZ可以先分辨下是IIS的内存?还是IE的内存?或者是数据库的内存?在上涨
      

  12.   

    因为内存不断上涨,占用不释放,
    所以,把本来用dataset赋给datatable的,换成datareader赋给datatable试试。
    结果内存问题依旧。
    刚才去掉反射,但没什么变化。嗯,谢谢,我先试试。
      

  13.   

    唉。。放iis上用着用着就 Server Application Unavailable 了
      

  14.   

    把使用完的datatable 直接赋值为 null 那?
      

  15.   


            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;
            }
      

  16.   

    http://support.microsoft.com/kb/919790  如何使用 IIS 调试诊断工具来解决对 IIS 进程中的存在内存泄漏
      

  17.   

    rdr.Close(),rdr.Dispose(),还有两个conn.Close()都去掉。
      

  18.   

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

  19.   

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

  20.   

    +1
    using和Close、Dispose只选一个
      

  21.   

    谢谢,我试试哦。比如:System.Web.Services.WebService 里面返回值
    我申明一个全局string,再方法里给它赋值,然后让它返回。会不会有并发高时导致的问题呢?
      

  22.   

    楼主干嘛 不直接 用 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(); 一次 多少会影响内存的
      

  23.   


    datatable.Load读取的话,会少第一条数据,不知道什么原因。然后,和这个关系不大。datareader换成dataset内存问题依旧。
      

  24.   

     你是说    if (rdr != null && rdr.HasRows && rdr.Read())
              datatable.Load(rdr);
    这里会少第一条数据吗?
    那是因为 你 if(rdr != null && rdr.HasRows && rdr.Read()) 判断的时候 用了rdr.Read() 已经读取了一次
      

  25.   

        using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
                { 
                    DataSet ds = new DataSet();
                    // 填充DataSet. 
                    da.Fill(ds);
                    return ds; 
                } 没必要使用 SqlDataReader 
      

  26.   

    参考:http://www.cnblogs.com/eaglet/archive/2009/10/14/1582928.html
    NewRow()方法引起的