想请专家说说,用DataSet做Web数据库操作,到底能占用多少服务器资源?举例问,我的数据库有几万条记录,网站同时在线几百人,这几百人会不断的浏览,更新,查询这些数据,服务器1G内存,3.0 Xeon,由于要做分页显示DataReader不行,所以用DataSet
以上情况用DataSet会对服务器造成多大负担?

解决方案 »

  1.   

    由于要做分页显示DataReader不行,所以用DataSet.==========================================================
    震惊!
    我的项目里没用一个DataSet,但到处都有分页显示啊.
      

  2.   

    Dataset是把数据读出,缓存在内存中。
    缺点:对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。
    优点:只需连接一次就可close于数据库的连接.*一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。
      

  3.   

    suhongwei(web_lover(真的不好意思,我太菜了!)) 告之小弟,DataReader如何实现分页,是用存储过程吗?另外我的数据库多需要即时更新,是不是应该用DataReader呀?
      

  4.   

    dataset作较少数据的容器还是可以的,如某个商品列表,保存前4页的记录在dataset是可以的,但不能把所有的商品都读到dataset中,难度在于区分出用户频繁访问的数据,和使用缓存后统一的数据获取方式。这些和你的业务逻辑有关.
      

  5.   

    dataset作较少数据的容器还是可以的,多少算少?
      

  6.   

    不超过20W条时用DATASET 一般没事不过最好用REPEATER(不修改数据的话),配合分页存储过程
      

  7.   

    自己分页,要多少数据取多少,不要一次获取所有数据,不行吗?
    加cache
      

  8.   

    ALTER PROC PageView
    @tbname sysname, --要分页显示的表名
    @FieldKey sysname, --用于定位记录的主键(惟一键)字段,只能是单个字段
    @PageCurrent int=1, --要显示的页码
    @PageSize int=10, --每页的大小(记录数)
    @FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
    --用于指定排序顺序
    @Where nvarchar(1000)='', --查询条件
    @PageCount int OUTPUT --总页数
    AS
    DECLARE @sql nvarchar(4000)
    SET NOCOUNT ON
    --检查对象是否有效
    IF OBJECT_ID(@tbname) IS NULL
    BEGIN
    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    RETURN
    END
    IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
    BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
    END--分页字段检查
    IF ISNULL(@FieldKey,N'')=''
    BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
    END--其他参数检查及规范
    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=10
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
    IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
    ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
    IF ISNULL(@Where,N'')=N''
    SET @Where=N''
    ELSE
    SET @Where=N'WHERE ('+@Where+N')'--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
    IF @PageCount IS NULL
    BEGIN
    SET @sql=N'SELECT @PageCount=COUNT(*)'
    +N' FROM '+@tbname
    +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
    END--计算分页显示的TOPN值
    DECLARE @TopN varchar(20),@TopN1 varchar(20)
    SELECT @TopN=@PageSize,
    @TopN1=@PageCurrent*@PageSize--第一页直接显示
    IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder)
    ELSE
    BEGIN
    SELECT @PageCurrent=@TopN1,
    @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
    +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
    +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder
    SET ROWCOUNT @PageCurrent
    EXEC sp_executesql @sql,
    N'@n int,@s nvarchar(4000) OUTPUT',
    @PageCurrent,@sql OUTPUT
    SET ROWCOUNT 0
    IF @sql=N''
    EXEC(N'SELECT TOP 0'
    +N' '+@FieldShow
    +N' FROM '+@tbname)
    ELSE
    BEGIN
    SET @sql=STUFF(@sql,1,1,N'')
    --执行查询
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' WHERE '+@FieldKey
    +N' IN('+@sql
    +N') '+@FieldOrder)
    END
    END
      

  9.   

    不超过20W条时用DATASET 一般没事,有根据吗?
      

  10.   

    dataset作较少数据的容器还是可以的,多少算少?
    --------------------------------------
    取决于你的业务需要和服务器负载,比如你知道80%用户可能只关注某种分类商品的前4页,设每页15条数据,那么以dataset缓存15*4条数据是合理的,如果某种逻辑需要比较多的数据,如成百上千,但是不会随着运行时间和访问量而增长,那么使用dataset作缓存也是可以的。
      

  11.   

    由于要做分页显示DataReader不行?DataReader不是一样可以分页行,DataReader只是读数据的,你做一个分页的存储过程不就行了。
      

  12.   

    我再描述一遍我的业务,请大家指点
    主要是电脑报价(表有几万条记录)而且经常被分页浏览(每页60条),或指定条件查询,这些都是针对游客的
    另外这些报价是由几百个经销商即时更新提供的,这些经销商会通过自己的管理后台不断的更新报价和电脑相关信息,每个经销商管理几万条记录中的一百多条记录
    网站每日总访问量在20万左右,同时在线不到一千请问以上情况如何用DataSet和DataReader
      

  13.   

    该分页的时候用存储过程分页,只读当前用到的数据,跟DATASET还是DATAREADER没多大关系
      

  14.   

    谁有用DataReader调用分页存储过程的例子,给小弟发一份,非常感激!
    [email protected]
      

  15.   

    看看我的blog 上面有 
    存储过程 分页最好不要用dataset自身的 分页 功能
      

  16.   

    找到以下存储过程,分页成功,但是如果order by 要多重条件怎么办呀?
    /*
      函数名称: GetRecordFromPage
      函数功能: 获取指定页的数据
      参数说明: @tblName      包含数据的表名
               @fldName      关键字段名
               @PageSize     每页记录数
               @PageIndex    要获取的页码
               @OrderType    排序类型, 0 - 升序, 1 - 降序
               @strWhere     查询条件 (注意: 不要加 where)
      作  者: 铁拳
      邮  箱: [email protected]
      创建时间: 2004-07-04
      修改时间: 2004-07-04
    */
    CREATE PROCEDURE GetRecordFromPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 关键字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        --@OrderStr     varchar(50),        -- 排序内容
        @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
        @strWhere     varchar(2000) = ''  -- 查询条件 (注意: 不要加 where)
    ASdeclare @strSQL   varchar(6000)       -- 主语句
    declare @strTmp   varchar(1000)       -- 临时变量
    declare @strOrder varchar(500)        -- 排序类型if @OrderType != 0
    begin
        set @strTmp = '<(select min'
        set @strOrder = ' order by [' + @fldName + '] desc'
    end
    else
    begin
        set @strTmp = '>(select max'
        set @strOrder = ' order by [' + @fldName +'] asc'
    endset @strSQL = 'select top ' + str(@PageSize) + ' * from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
        + @strOrderif @strWhere != ''
        set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
            + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
            + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
            + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
            + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderif @PageIndex = 1
    begin
        set @strTmp = ''
        if @strWhere != ''
            set @strTmp = ' where (' + @strWhere + ')'    set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
            + @tblName + ']' + @strTmp + ' ' + @strOrder
    endexec (@strSQL)GO