web 页面显示大量数据

TechWeb-技术社区's Archiver

TechWeb-技术社区 » 程序开发 » .NET » 如何提升大数据量页面的加载速度?


发表于 2008-4-3 12:09

我觉得客户无非就是要有一个良好的体验,既然有这样的要求,用Ajax就是较好的选择,这样就不会让界面堵死在那里,至于javascript的执行效率问题,相对于对数据库的查询时间来说,可以忽略。


发表于 2008-4-3 12:09

1.最好是写存储过程和索引

dY8O+|:P3`9? 2.全部一次性装载,放入缓存,只显示前n条,有事件触发,再载入下n条 M1gm1^4Wj

3.等待提示,友好性


发表于 2008-4-3 12:09

对于table有

j9M`w8bN3Z5VJ thead,tbody,tfoot这些个标签。table是数据加载完后整体显示的,用上tbody后就不一样了,它将会从上到下,一个一个tbody块来显示的,tbody可以有多个,其他两个最多只能有一个。


发表于 2008-4-3 12:09

10K行的话,如果页面又比较复杂,基本上ie会挂掉,别想追求性能了。

T8M)Q2l;~ ]-X 难道他以为ie可以当作SQL server用?


发表于 2008-4-3 12:10

1w行,估计是难为人吧!


发表于 2008-4-3 12:10

客户很洋很强大:((((


发表于 2008-4-3 12:10

很难想象10k行 不分页如何去看...

A~!~-_`-C RJQ

!B;Sk.D}/nhw P 其实你给客户呈现1万行,他也未必能都用上吧。

:h;N"DY1P*m8M

ftB-E&CQ4y 还是想办法按需呈现才好


发表于 2008-4-3 12:10

PS:没想到在这里能碰上jspadmin,很意外。


发表于 2008-4-3 12:10

一万行数据,就算用最简单的DIV+CSS,生成的HTML代码也要3M~5M吧,也就是说相当于下载一首MP3了,如果不用异步读取数据,只能一次性从服务器将这首Mp3下载下来,也就是说,只能靠服务器性能和网络传输速度了,很难很无奈 !i;] @H8t'z2zYgG|


1x)ucKw:UJA? 所以Ajax的确是个很不错的选择

9b8Z+AQm8x 2p7Ki9{8_0MJ

方案一:写一个分页存储过程,载入页面后,算好行数及页数,将10000行数据同时进行10~20个页数的异步读取,也就相当于多线程下载.

wGIzplM o ,~`Y)z3J$ao%o

方案二:如楼主所说,利用滚动条动作window.onscroll,计算应该显示的行数,动态调用Ajax去取得当前页面应该显示的数据 4Qt"w)Z3[/~:n

T&bPQX1Vo$gw

楼主可以比较一下两种方案的效率及实现难度再进行决择!


发表于 2008-4-3 12:10

估计客户的网络速度挺快的!


发表于 2008-4-3 12:10

无用功能,改一下:用户点击报表后,直接提示:“系统正在导出excel文件,需要花费一定时间” 给他倒个excel就可以了。剩下的交给客户对10k条数据 进行分析。否则谁有空 拖滚动条浏览10k条记录?


发表于 2008-4-3 12:10

BT的需求总会有的,就象有些需求是无聊的一样.但却给技术实现提出挑战. {3ZVq(@ wm

我最近也在琢磨一个大表的显示,但还没有BT到10K行.以下是我的实现思路,不知能否对楼主起点作用? A&?T3`Kf)pv(y


lMRo�k6NIC Javascript+DHTML: 0n$o�Z&qHFBN


&LRe'V#OIi F]nE 1,将表格中内容生成为Array数据;

{4]p,T&n0n%N o(RL` 2,建立表格对象,将Array数据分布在表格中;

rf.H.iC_)h 3,尽量用table的属性来风格化表格,不要用CSS;

W?!Na*uK:~ 4,也许用户还有更BT的打印需求,用其它方式可能不能满足;

+_?Kdk{ 0^8T1u3xM1bO!t


/a;[-rn#U.K4b9j&B 告诉用户,10K行数据,不是1K行数据,总要花些时间的.将电脑的所有优势都挖掘出来还不能解决问题的话,只有从改善硬件上来想办法了.

.x#P!L_ ~:j+g$g

Yw%D(VZ�I-L 一头牛拉再轻的车也不会象飞一样, 除非你会吹! ^-^


发表于 2008-4-3 12:10

此法可行 比如当前有8000条记录 约占有8000行 只在滚动条当前所在的屏幕区显示指定的一定数据量(如100条) 其它只是900行回车符" " 如果拖动鼠标后没有超过此100条的区域就正常显示 否则再重新通过ajax调用输出 取数据用分页存储过程其实是分页存储过程的变相实现 (即共有记录8000条 每页100条记录 共80页 由滚动条位置判断当前页) 当然这个"当前页"的判断要麻烦点表头和表尾部分处理费事些 但花些时间能够实现


发表于 2008-4-3 12:10

我记得好像在起点碰到过这个功能。 yAa!Z\ z

在阅读当前小说得时候有个 阅读全部的按钮。

K:];t0~N 应该是一样的功能


发表于 2008-4-3 12:10

这种用法是最快的:

z y_0?/C

Z7e�V5GB YX 1. #y7H%e yX3k

在工程中添加一个这个文件BaoBiaoHandler.ashx; Ft*S1_8a'V

然后把按钮的链接指向这个文件;在这个文件中你就可以随便的写了;这个文件之所以快的原因是因为它本身就是一个http处理程序,并且它不要状态保存等一些操作,是一个直接执行的文件,类似于java中的serlvet文件。 cD N*sc


*x�\H0H~k3fy 它的写法和普通的cs文件没什么区别;一样的。

.N(bwmQ'y0i

&qU}5cl 你要生成报表 %aHT^io3Orb

context.Response.ContentType = "image/jpeg";这个属性是必须; [H2XW{Hv D

FileStream fs = File.Open(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif", FileMode.Open);

#c%rB;u:m.Z R9ESela;e6{5B

byte[] fsBuffer = new byte[fs.Length]; H[:CH`t:F#or7\

int i = fs.Read(fsBuffer, 0, fsBuffer.Length); lxX-~[gA7~Gqkk

fs.Close(); ,AH#Eo-]veSz

K8zg1mq$r

context.Response.WriteFile(context.Request.PhysicalApplicationPath + "d6dd57088b97b79e0b7b821e.gif"); //.BinaryWrite(fsBuffer); //.OutputStream.Write(fsBuffer, 0, count);

+H1U!~4SP O9V%X(~ context.Response.Flush(); p~&N/Q2ZBD

这个是生成一个图片;你可以修改成你的需要。

HC/~.D#Sa%fB

w ^,qOY(`7N 2. }]6G8k%y:P~

你也可以这样,写一个cs文件继承自IHttpHandler接口,实现一个自己的Http处理程序,

MN6K3f9Tw�sieoxu public class Httphandler : IHttpHandler k~2{;[9O-y

{ }5j/HJN&r

public Httphandler()

B9a/O:}p3|oEJ4TO4? {

&?6CD-T;KOY;f;s

1u|G'|~1Q!? } (N[*hM5BEAS%G%m

-M1z\{8dh

#region IHttpHandler 成员 Sx PJ;[u(|$KE


Uetv1o bool IHttpHandler.IsReusable

;k)Vh[RK9Z R {

e&fH9H*dg:PX get { return true; }

a�LrpB| }

9VIhD�J ~ 0DO5J(v~K!XU

void IHttpHandler.ProcessRequest(HttpContext context) b'@ty"X-ra9Yd|;w

{ V)T&~Z\#s(XD3Z,H,xm


G5M%rSS~@ 5BiGXG5W

System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter(SqlString,Conn);

1a0G7zwL`L DataSet ds = new DataSet(); ? I-X[W(m0G

adp.Fill(ds); b g;w%Z!D`jU

DataGrid dg = new DataGrid(); 9s }fW9O5z8P

dg.DataSource = ds.Tables[0]; 0g\)P4e E1z.Ol

dg.DataBind(); y p"{.}NH W

StringWriter sw=new StringWriter (); 't�H&rfS R-p

HtmlTextWriter htw=new HtmlTextWriter (sw); 2Bf8S5} zd

dg .RenderControl (htw); a;@}L(`wl)w

string html = sw.ToString();

f9KH&f? context.Response.Write(html);

(n0Hj s7Fbh } f%N2AN&~a)n_ N7p


Q�jKf5l9[8i #endregion

@B~F.t U } 9y a@$spe

} wmD^#wg(e

也可以,然后你要在web.config文件中注册以下这个

M b1k.ig1~ 6_[z ]a:M

//这个cs文件放在App_Code中

7K H!M g)RoNj y+PZ)`GR,~iH{2a

然后再IIS中添加一个isapi映射,对这个sqlx的请求都会使用这个类来返回了,非常快;

_T*_kj#Ys$d 扩展名可以随便定义的


发表于 2008-4-3 12:11

不考虑前后台种种优化,不用分页,如何实现 一点击报表加载按钮,报表逐(n)行显示出来?有没有好的解决方案?

FjsTL] ^E0ua ?x

2v3BQ&_-uaY*yu 你都把"好的解决方案"统统否决了. xuO c/v


.pc:ya!o1o9O8e�b 那就只能硬来了,你升级服务器,升级网络,升级客户机吧.


发表于 2008-4-3 12:11

这种数据量只能考虑数据库分页了

Zk(mSF9r\xt:k E 给你个提示,传入数据库页码和页面条数,数据库只返回相应条数的数据 koiJf

即传说中的后台分页,这样别管你数据nnnnk条,都很快。 Le+Xo&ACV

相应的控件网上有很多,开源的也有,可以自己看看。


发表于 2008-4-3 12:11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值