若天明 发表于 2015-1-16 23:10:30

ASP编程:一种实际上最快的Web数据库分页办法

asp对于服务器的要求较高,一般的服务器如果访问量一大就垮了,不得不重启。web|分页|数据|数据库上篇我们谈到了关于数据库传统的三种分页办法和他们的利害,而且提出了一种实际上最好的分页办法,本篇我们就来具体说说这类最好的分页办法。

一:构想。
在计划Web数据库时,假如我们要编历每条记录,那末只要接纳分页形式才可使Web数据库尽快,尽好的出现给终端用户,也不会由于8秒准绳而利用户得到扫瞄该页的乐趣。可是即便接纳分页的举措,当呈现多记录的数据库时,也不免会使我们的用户感应翻页时速率太慢。就好像我的上篇文章说的那样,几近上一片文章的三种分页办法都有一些缺点。那末,我们怎样做到能让数据库每次就取我们必要的记录,这个很好完成,有游标前往多个记录集就能够完成,可是假如让数据库的一端不会由于要恰好检索一页的记录而年夜耗资本就很难了。最初,经由我的不休改写程序与测试,终究编写出了我以为实际上最快的Web数据库分页办法。

二:详细完成的存储历程。
我们分离一个BBS成绩来谈谈这类办法。怎样让一个BBS每次每页只实际必要的一页记录呢?而我们必要供应给数据库有那些参数呢?大概会有以下参数。
第一:就是我们必要确当前的页数。
第二:以后界说的每页的记录集数量。如许你就能够依据必要在页面程序中修正每页的记录数。固然,假如你不思索程序的可扩大性,你也能够在数据库里间接划定每页有N条记录便可。
第三:一个输入参数:就是从数据库里得出以后表中总记录数量的几。(注重,他不是一个页的记录数量)他相称于ADO分页法中的Recordcount。假如你不必要总记录数量能够不必前往他。
我们来看详细存储历程的代码。。。

CREATEPROCEDUREdbo.PRO_pageview
(

@tint_tableidtinyint=1,--这个是BBS确当前版面Id,你能够不必管他。。
@int_pagenowint=0,
@int_pagesizeint=0,
@int_recordcountint=0output--就是得出BBS某个版面的总贴数。。

)

AS
setnocounton

declare@int_allidint
declare@int_beginidint,@int_endidint
declare@int_pagebeginint,@int_pageendint

select@int_allid=count(*)fromtab_discusswheretint_level=0andtint_tableid=@tint_tableid
select@int_recordcount=@int_allid--得出该版面的总贴数

declarecro_fastreadcursorscroll
forselectint_idfromtab_discusswheretint_level=0andtint_tableid=@tint_tableidorderbyint_iddesc--这里界说游标操纵,可是不必一时记录集,并且游标也不必要全体遍历一切记录集。

opencro_fastread--翻开游标
select@int_beginid=(@int_pagenow-1)*@int_pagesize+1得出该页的第一个记录Id
select@int_endid=@int_beginid+@int_pagesize-1得出该页的最初一个记录的Id

fetchabsolute@int_beginidfromcro_fastreadinto@int_pagebegin将他的Id传给一个变量该页入手下手的Id
if@int_endid>@int_allid--这里要注重,假如某一页不敷流动页数的记录时。如只要一页记录,并且记录少于我们界说的数量。大概是最初一页时。。。
fetchlastfromcro_fastreadinto@int_pageend--间接将游标相对定位到最初一条记录,得出他的id号来。。。
else
fetchabsolute@int_endidfromcro_fastreadinto@int_pageend

selectint_id,tint_level,tint_children,var_face,var_subject,datalength(txt_content)asint_len,sint_hits,var_url,var_image,var_user,dat_time,tint_tableid,bit_kernulfromtab_discusswheretint_tableid=@tint_tableidandint_rootidbetween@int_pageendand@int_pagebeginorderbyint_rootiddesc,num_orderdesc--我们就能够使用该页的第一个id和最初一个id得出两头的id来。。。。(注重。我们这个BBS的数性布局用了一种很奇妙的算法,就是用一个orderNum浮点数便可完成排序。。。)
--入手下手清场。。。
closecro_fastread
deallocatecro_fastread

return


我们再看看Asp页面里的程序操纵。。。

pagenow=cint(request("pagenow"))--以后的页面。

ifpagenow<=0thenpagenow=1
pagesize=10

setcmd=server.CreateObject("adodb.command")
cmd.ActiveConnection=strconn
cmd.CommandType=4
cmd.CommandText="pro_pageview"

cmd.Parameters.Appendcmd.CreateParameter("tint_tableid",adInteger,adParamInput,,tint_tableid)cmd.Parameters.Appendcmd.CreateParameter("int_pagenow",adInteger,adParamInput,,pagenow)cmd.Parameters.Appendcmd.CreateParameter("int_pagesize",adInteger,adParamInput,,pagesize)cmd.Parameters.Appendcmd.CreateParameter("int_recordcount",adInteger,adParamOutput)
setrs=cmd.Execute
ifrs.eofthen
Response.Write"今朝已凌驾了记录个数或记录集为空!"
Response.End
endif

dimarrRs
arrRs=rs.getrows能够使用getRows将记录集敏捷保留到一个二维的数组中来进步速率。

recordcount=cmd.Parameters("int_recordcount")
注重,当记录不敷以恰好整除单元页记录时,我们也要将其界说为一页,如记录数量为2页多一个记录,此时我们的页数也要为3页记录。
if(recordcountmodpagesize)=0then
pagecount=recordcountpagesize
else
pagecount=recordcountpagesize+1
endif


<--分页入手下手-->
流动的分页函数,实在不过是pagenow+1或pagenow-1,pagenow,pagecount


















三:特性
我们来看看他和传统的三种办法的区分与特性
第一:每次只传回一页记录,并且只构成一个记录集,并且客户端能够接纳速率最快的前方游标来完成页面输入。而不用像传统的游标法用rs.nextrecordset记录来输入记录。
第二:数据库没有效光临时表,如许比转储记录集的速率年夜年夜进步。
第三:接纳一个转动游标,并且游标只经由二个操纵就完成定位。速率也年夜年夜进步。

当我接纳了这类分页办法时,已能够分明的感到出分页速率的进步了。固然,在处置树型布局,数据库运算时,我接纳了很多办法尽量的进步速率,如:接纳二分区间法来编历树型布局,全体接纳存储历程来完成统统sql操纵,接纳触发器和数据库游标来完成数据库算法,如许就只管制止过量的收集传输。任何操纵只和数据库举行一次参数传送就能够完成。
感乐趣的伴侣能够到我的论坛来看看:http://tec.xj169.net/bbs


(全文完:仅以此篇文章感激蒋立新年老对分页成绩的质疑,没有他的固执切磋,也不会有本文的出生,还要感激bigeagle与廖家远,他们的分页算法也给了我良多的启示。)
</p>强大的可扩展性。ASP具有强大的扩展性,可以实现与多种网络、硬件设备的连接:通过专用的通讯线路远程接入企业;通过远程拨号服务器为远程拨号客户提供服务;通过WAP为移动电话互联网客户服务。

仓酷云 发表于 2015-1-18 12:56:47

封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。

活着的死人 发表于 2015-1-18 18:50:53

没有坚实的理论做基础,那么我们连踏入社会第一步的资本都没有,特别对于计算机专业的学生学好专业知识是置关重要的。在这里我侧重讲一下如何学习ASP,从平时的学习过程中。

若相依 发表于 2015-1-20 13:58:44

兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的

海妖 发表于 2015-1-29 08:40:17

掌握asp的特性而且一定要知道为什么。

变相怪杰 发表于 2015-2-6 00:07:27

没有坚实的理论做基础,那么我们连踏入社会第一步的资本都没有,特别对于计算机专业的学生学好专业知识是置关重要的。在这里我侧重讲一下如何学习ASP,从平时的学习过程中。

小女巫 发表于 2015-2-14 11:58:24

运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。

莫相离 发表于 2015-3-4 06:14:24

掌握asp的特性而且一定要知道为什么。

简单生活 发表于 2015-3-11 17:42:34

兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的

若天明 发表于 2015-3-19 04:23:36

交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。

柔情似水 发表于 2015-3-27 07:46:42

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
页: [1]
查看完整版本: ASP编程:一种实际上最快的Web数据库分页办法