似乎是很浪费效率,但是既然微软提出使用dataset,应该会进行相关优化,使支持更好吧

解决方案 »

  1.   

    如果是对每个用户我就更担心了,如果有1000个用户(很正常),每个DataSet缓存了3个表每个表1000行,每行50列,每列50字节,那么Server上缓存的DataSet的内存消耗为1000*3*1000*50*50~=7500M, 哈哈,什么服务器也受不了啊!
      

  2.   

    何时Server放弃缓存,如果用户已经断线了,它如何知道?
      

  3.   

    天啊,DataSet还能用吗?!!!
      

  4.   

    ------------不如写封求助信到微软技术中心询问吧,也许他门会有答案
    mail address?
      

  5.   

    csdn上高手很多呀,难道没人回答吗?
      

  6.   

    DataSet并不是时时连线的.只有.FILL或.UPDATA方法调用时他才与DABABASE连接.
    1000用户问题是不存在的SQL也只支持2000多个线程连接.而且是没用户一线程
      

  7.   

    SQL也只支持2000多个线程连接.而且是每用户一线程
      

  8.   

    稍懂点存储过程的用户都使用存储过程分页,若你不懂存储过程,也可以用我写的这个控件试试:http://www.webdiyer.com
      

  9.   

    DATASET是在客户端的你知道就好
      

  10.   

    每个客户端一个DATASET
    DATASET是在客户端的你知道就好
      

  11.   

    DataSet在客户端吗?老大,谁告诉你的???
      

  12.   

    填充完dataGrid后,立即清空dataset里的数据。哎............................................................7500M????????你的算数很精啊,细仔想一想可不可能啊!!!!!.....
      

  13.   

    说7500M的那位,你喝多了吧,说每一个用户的那位,你实际测试过没有,DATASET同一版本只存在一份,但有一个时间值,在过期前没有人去改动它的话,它会直到过期才重新建立一份新的,同一份DATASET,一给修改马上更新.DATASET问题不是在这里.DATASET的问题在于一个WEB程序不只一个页,如果每一个页都建一份DATASET,占的内存是可观的,更大的问题在于,如果 我们用READER来处理数据,一个READER只有在处理数据时才占一行数据大小的内存,能有效减少内存的占用,但我做的测试来看,1万行数据,用DATASET处理比用READER快7%左右,但用READER时每次只取少量数据,占的内存是少了,但需要读取的次数和频率也剧巨增加,会造成CPU占用利害,DATASET则是全部取,占的内存可观,呵呵,这就是鱼与熊掌的问题了,我们看问题不能单方面 来看呀,要对比一下,在合适的地方用合适的方法才是最好的
      

  14.   

    大家讲得很好.
    附DataGrid用存储过程分页代码
    --
    --当direct=0时,从@Row向前取@Rows行记录(不包括@Row行)
    --当direct<>0时,从@Row向后取@Rows行记录(不包括@Row行)
    --
    ALTER PROCEDURE Z_Page(@ROWS  int,
    @Row int,
    @direct bit=1)
    AS
    DECLARE @rowCount int, @TID int, @CID int,@Cnt nchar(16)
    DECLARE @tmpTable Table(PKID int PRIMARY KEY,ParentID int,Name nchar(16))

    DECLARE Trade_Cursor SCROLL CURSOR FOR

    SELECT PKID, ParentID, Name
    FROM SubjectWordLibrary
    ORDER BY  PKID
    --
    if(@Row>(select count(PKID) from SubjectWordLibrary)+1)
    set @Row=(select count(PKID) from SubjectWordLibrary)+1
    if(@Row<0)
    set @Row=0

    if(@Direct=0)
    begin
    if(@Rows>@Row-1)
    set @Rows=@Row-1
    end
    else
    begin
    if (@Rows>(select count(PKID) from SubjectWordLibrary)-@Row)
    set @Rows=(select count(PKID) from SubjectWordLibrary)-@Row
    end
    --
    set @rowCount=1
    OPEN Trade_Cursor
    While @rowCount<=@ROWS
    BEGIN
    if (@direct=0)
    set @Row=@Row-1
    else
    set @Row=@Row+1
    Begin
    FETCH ABSOLUTE @Row FROM Trade_Cursor 
    INTO @TID,@CID,@Cnt 
    While @@Fetch_Status<>0
    break
    Insert into @tmpTable values(@TID,@CID,@Cnt)
    set @rowCount=@rowCount+1
    End
    END
    CLOSE Trade_Cursor
    DEALLOCATE Trade_Cursor
    SELECT * FROM @tmpTable ORDER BY PKID
    RETURN
    GOprivate void DataBoundTradeList(string cmmd)
    {

    try
    {

    this.currentPageIndex=(int)ViewState["CurrentPageIndex"];


    object[] v=new object[3];
    v[0]=pageSize; 
    switch(cmmd)
    {
    case "Provious":
    this.currentPageIndex --;
    v[1]=this.currentPageIndex*pageSize+1;
    v[2]=0;
    break;
    case "Next":
    v[1]=this.currentPageIndex*pageSize;
    v[2]=1;
    this.currentPageIndex++;

    break;
    default:
    this.currentPageIndex=1;
    v[1]=0;
    v[2]=1;
    break;
    }

    this.BuildTMDataSet(v);


    }
    catch(Exception e)
    {
    Page.Response.Write("<p>BuildDataSet:" +e.Message+"</p>");
    }
    finally
    {
    ViewState["CurrentPageIndex"]=this.currentPageIndex;
    this.dlstTrade.DataSource=this.TMds.Tables[0].DefaultView;
    this.dlstTrade.DataKeyField="TradeMarkID";
    this.dlstTrade.DataBind(); 
    }
    }
      

  15.   

    查询结果分页是以较小数据子集(即页)的形式返回查询结果的过程。它通常用于以易于管理的小块区的形式向用户显示结果。DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。但是,对于大量的查询结果,它可能并不是首选的分页方法,因为 DataAdapter 虽然仅使用所请求的记录来填充目标 DataTable 或 DataSet,但仍会使用返回整个查询的资源。若要从数据页中返回一页数据,但不使用返回整个查询所需的资源,请为查询指定附加的条件,这些条件用于将返回的行减少到所需的行。若要使用 Fill 方法返回一页数据,请指定 startRecord(它指定该数据页的第一个记录),并指定 maxRecords(它指定该数据页中的记录数)。 
      

  16.   

    1.如果那页的数据是基本一样,用的人多,用cache, 所有的人都用一个。2。 你采用上面的方法,就不存在这个问题了。 要不你就取单页要显示的数据吧