数据库里面不到3万条数据
用了嵌套查询,一共查询了2个表。
用gridview控件分页显示的数据。现在出现的问题是:
1、每次翻页,速度都有点慢,翻页速度和刚打开这个页面的速度差不多(个人感觉翻页应该速度快点)
2、打开这个页面的时候,iis的应用池迅速增长到了260mb左右
3、多次翻页之后,页面卡住,然后显示出错信息:应用池超过最大数。应用池设置并没有限制内存使用和虚拟内存使用大小。请问大家有什么办法?
是不是必须得优化?优化的话应该怎么优化?

解决方案 »

  1.   

    你怎么读取的?!select * from.....?!这样?!
      

  2.   

    用gridview自带的分页
    数据库读取用的SqlDataSource控件,然后在SqlDataSource里面设置了嵌套查询视图。
      

  3.   

    不耗资源才怪,那么多条数据,哪有人一次全读出来的。
    如果是SQL SERVER 2K的话,找个分页存储过程,分页读取。
    如果是2.5K的话,好象有个返回指定行数的东东./
      

  4.   

    用的sql server 2000 sp4用asp程序的时候没遇到过这种情况
    最近学习 .net 才发现的这个问题请大家教教我怎么解决,谢谢了
      

  5.   

    我的也是前段时间出现这个情况,不过我把所有的用不着的connection、dataset、adapter等注销了以后就好了,如con.disopse(),不知你的是不是这个问题,共同学习,呵呵!
      

  6.   

    楼主对分页连接数据库,数据具体操作不熟悉?
    希求高手解答,而不是泛泛而谈
    因为gridview有内嵌分页功能,所以楼主对内嵌实际的运行机制很不了解,而且不知道怎么自己根据内嵌弊端自己修改解决...
    不然将永远不能从"答案"中得到答案
      

  7.   

    3万条一般的记录gridview自带的分页不会很卡的,可能是你数据库打开后没有关闭或者资源回收,嵌套查询的代码有问题 
      

  8.   

    显示多少取多少,不要用DataSet,用DataReader
      

  9.   

    自己用.net时间不长
    不知道gridview自带分页有什么弊端。现在显示数据等一切都正常,打开页面之后,每次翻页,应用池就会增长大概30mb
    连续翻页5次以后,就会卡住,然后提示应用池超时,并且达到应用池最大。代码里面仔细检查过了,
    每个conn结束后都有 conn.close() 和 conn.dispose()
    每个dr 结束后也加上了 dr.close() 和 dr.dispose()
    可是问题依旧,还是出现应用池问题。还有个问题就是,自己写的代码,可以conn.close()和conn.dispose()来释放资源,
    gridview使用SqlDataSource控件来打开的,怎么释放资源?
    出现这种问题,是不是和这个有关?请大家帮忙。
      

  10.   

    用的sql   server   2000   sp4 
      

  11.   

    打开这个页面的时候,iis的应用池迅速增长到了260mb左右 
    此页面的情况是什么,读取大量数据库?有没有死循环?
      

  12.   

    单独在查询分析器中运行你那个页面的sql语句,看看内存使用和运行时间情况,进一步判断是数据还是程序内部问题
      

  13.   

    我仔细看了下
    准确的说,初次打开这个页面,应用池大小增长大概50mb
    然后每次翻页,应用池都每次增长大概50mb
    偶尔有时候资源瞬间自动释放,应用池恢复正常大小,但是大多时间应用池是一直增大。
    连续翻页大概5次,应用池就卡住了,然后提示:
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。开始打开页面的时候,程序一切正常,就是速度感觉有点慢,
    用gridview显示,数据读取用的SqlDataSource
    cs里面定义了嵌套查询方法,等于一共读取了两个表。
    读取的主表不到3万条数据,副表没统计有多少数据。这个页面要实现的功能,比如说
    我在此论坛注册了用户,注册信息一个表
    然后我在论坛发帖,发帖一个表
    现在这个页面要统计,
    显示此论坛的所有注册用户,并且显示每个用户发了多少帖子。cs里面每次打开数据,结束后都用了 close和dispose
    其他的也不知道应该怎么做了。
      

  14.   

    超时时间已到 这个应该是sqlserver的超时,说明是sql语句的问题,不是.net程序上, 你要单独在查询分析器中调试那条语句,并选上 “包括客户端统计” 和 “服务器执行计划”, 可看到响应时间,如果过长,你得优化sql语句, 若不行,把你的语句贴出来
      

  15.   

    1.你试一下将sql语句不用嵌套
    2.你可以用存储过程
      

  16.   

    还有不用的资源最好马上释放掉,不要等gc.
    多用using语句
      

  17.   

    gridview链接数据库用的
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>"
                                        SelectCommand="SELECT * FROM [larchives] ORDER BY [user_id] DESC"></asp:SqlDataSource>写了个方法,嵌套第二个表
    public static string xiangpian(string xiangpian)
        {
            SqlConnection conn = db.conn();
            SqlCommand select = new SqlCommand("select count(id) from pho where user_id=" + xiangpian, conn);
            conn.Open();
            SqlDataReader dr = select.ExecuteReader();
            if (dr.Read())
            {
                return dr[0].ToString();
                dr.Close();
                dr.Dispose();
            }
            else
            {
                return "0";
                dr.Close();
                dr.Dispose();
            }
            conn.Close();
            conn.Dispose();
        }
      

  18.   

    dr.Close(); 
    dr.Dispose();
    return   dr[0].ToString(); return   应该写在最后,可简化为:
    conn.Open();
                int rsCount = 0; //返回值
                using (SqlDataReader dr = select.ExecuteReader())
                {
                    if (dr.Read())
                    {
                        rsCount = (int)dr[0];
                    }
                }           
                conn.Close();            onn.Open();
                int rsCount = 0;  //返回值
                object result = select.ExecuteScalar();
                if (result == null)
                    rsCount = 0;
                else
                    rsCount = int.Parse(result.ToString());
                conn.Close();            //其实可以不用判断 dr.Read() 和  if (result == null) 
                //因为select count() 总会返回一行结果
      

  19.   

    不要用那个什么sqldatasource控件,我没有看过真正项目用那种控件的。
    http://www.code-studio.net/CSView.aspx?aid=244
    SQL Server 2000通用分页查询存储过程
      

  20.   

    使用GridView默认的分页功能来查看数据以前所有的3W条数据其实就被你取出了,这实际上是“假”的分页,它并不是像我们想像的一样,当我们查看某一个页的数据的时候只是从数据库中取出了相应的,恰恰相反,它是取出的所有的,然后利用GridView再来分页。如果要做到真实的分页,可以在网上找一些其它网友们写好的分页存储过程来分页,传入像每页大小,要显示的页索引等信息然后返回本页的数据。页分页的操作可能不能使用GridView默认的功能了,可以自己使用按钮或是动态的生成分页标签。简单的我可以给楼主提供一个分页方法,但是否采用由楼主来决定,因为我提供的是利用游标来分页的: DECLARE @Handle INT
    EXEC  SP_CURSOROPEN  @Handle OUTPUT, @Sql ,@scrollopt=1,@ccopt=1, @rowcount= @Total OUTPUT
    EXEC  SP_CURSORFETCH  @Handle, 16, @_Index, @Size    
    EXEC  SP_CURSORCLOSE  @Handle 上面的语句执行后会返回两个结果,第一个是表结构信息,可能会用不到,第二个是实际分页后的数据。
    @Sql 是任一个查询性质的Sql,楼主可以参考使用。
      

  21.   

    用aspnetpager分页控件吧。配合存储过程使用。自动分页每次都是查询出所有的。然后只显示当前页数据。只是“假象分页”。要显示多少就查多少。效率很高的。