当前位置: 技术问答>java相关
请问大家编分页显示都用的什么方法?(如何读取数据库,保存结果)
来源: 互联网 发布时间:2015-04-04
本文导语: 今天做个项目,数据库中有几十万条记录,查询显示的结果也有几万到十几万的记录,所以我原来的分页显示就用不了了(方法太笨:又耗资源,又慢)。 不知大家都是如何进行分页的,并能够适合我这种大数据量...
今天做个项目,数据库中有几十万条记录,查询显示的结果也有几万到十几万的记录,所以我原来的分页显示就用不了了(方法太笨:又耗资源,又慢)。
不知大家都是如何进行分页的,并能够适合我这种大数据量的情况!
主要困扰我的问题:如何加快速度?几十万条的纪录查一次很费时间,我不想每次在不同的页码间跳转时都查一次数据库,但又不可能在第一次查询时就将所有的结果保存起来(我试过出现out of memory)。谁有好办法吗???
不知大家都是如何进行分页的,并能够适合我这种大数据量的情况!
主要困扰我的问题:如何加快速度?几十万条的纪录查一次很费时间,我不想每次在不同的页码间跳转时都查一次数据库,但又不可能在第一次查询时就将所有的结果保存起来(我试过出现out of memory)。谁有好办法吗???
|
有本书叫 Java servlets什么的,我记不清楚拉,你到网上书店查吧,里面有个好例子!!!!!!!!!
|
CREATE PROCEDURE SP_GetauthorPage(
@CurrentPage int,
@PageSize int
) AS
declare @sSQL1 varchar(500)
declare @sSQL2 varchar(500)
declare @iCount int
declare @PageCount int
declare @RecordCount int
set @iCount=@CurrentPage*@PageSize
print @iCount
select @RecordCount=Count(*) from author
print @RecordCount
if @RecordCount >0
begin
if @RecordCount % @PageSize=0
begin
set @PageCount=@RecordCount/@PageSize
end
else
begin
set @PageCount=@RecordCount/@PageSize+1
end
if @CurrentPage0
begin
set @sSQL1='(select top '+ ltrim(rtrim(str(@iCount))) +' * from author order by au_lname ) as tmp'
--print @sSQL1
set @sSQL2='select top ' +ltrim(rtrim(str(@PageSize)))+' * from '+@sSQL1 +' order by au_lname desc '
print @sSQL2
EXEC(@sSQL2)
end
else
begin
select top 0 * from author
end
end
else
begin
select * from author
end
GO
@CurrentPage int,
@PageSize int
) AS
declare @sSQL1 varchar(500)
declare @sSQL2 varchar(500)
declare @iCount int
declare @PageCount int
declare @RecordCount int
set @iCount=@CurrentPage*@PageSize
print @iCount
select @RecordCount=Count(*) from author
print @RecordCount
if @RecordCount >0
begin
if @RecordCount % @PageSize=0
begin
set @PageCount=@RecordCount/@PageSize
end
else
begin
set @PageCount=@RecordCount/@PageSize+1
end
if @CurrentPage0
begin
set @sSQL1='(select top '+ ltrim(rtrim(str(@iCount))) +' * from author order by au_lname ) as tmp'
--print @sSQL1
set @sSQL2='select top ' +ltrim(rtrim(str(@PageSize)))+' * from '+@sSQL1 +' order by au_lname desc '
print @sSQL2
EXEC(@sSQL2)
end
else
begin
select top 0 * from author
end
end
else
begin
select * from author
end
GO
|
我也在做这样的事,我用的是java servlet 网页显示,我是这样的处理的,用存储过程将记录取出来,定义一个Vector()矢量,用rs.next()!=null将rs中的记录取出来放到Vector中,再将Vector放到session中,分页显示时从session中取数据,你有足够大的内存就可以了,我的记录控制在2000条内。
还有我想问一个很简单的问题:如果查询记录有几万到几十万条,即使你实现了分页显示,就当你一页显示100条,那你至少也要一百多页,那你怎么知道你所要的在哪一页?这样做有意义么?
还有我想问一个很简单的问题:如果查询记录有几万到几十万条,即使你实现了分页显示,就当你一页显示100条,那你至少也要一百多页,那你怎么知道你所要的在哪一页?这样做有意义么?
|
在jdbc里采用sql语句解决,每次翻页查询数据库,取出每次所需要的几条数据,一个sql轻松解决,前提是获得已经获得所有的页数,包括你的记录总数
采用vector解决对于数据量小比较合适,大数据量不行,一次查询放到session里,如果用户量很大,服务器可能撑不住
采用vector解决对于数据量小比较合适,大数据量不行,一次查询放到session里,如果用户量很大,服务器可能撑不住
|
是不是可以这样
整个网站用一个JavaBean,里面存所有的几十万条数据(可以用Vector),所有的查询从它里面取
然后再做一个JavaBean用来访问上面一个JavaBean,提供一些方法来实现分页查询。
做一个类似监听器的程序,如果数据库有更新,就自动的更新第一个JavaBean.
缺点,如果类似的分页页面很多就特别耗内存,但只有一两个应该行吧?
整个网站用一个JavaBean,里面存所有的几十万条数据(可以用Vector),所有的查询从它里面取
然后再做一个JavaBean用来访问上面一个JavaBean,提供一些方法来实现分页查询。
做一个类似监听器的程序,如果数据库有更新,就自动的更新第一个JavaBean.
缺点,如果类似的分页页面很多就特别耗内存,但只有一两个应该行吧?