网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

技术你我(sql中的limit用法)

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
关于sql中的limit用法
    =================
    今天检查web程序,浏览时,突然发现该web程序中不能浏览了,出错了,如下:希望有同样的错误的同行看到了,不再犯同样错误..嘎嘎
    500ServletException
    java.lang.OutOfMemoryError
    --------------------------------------------------------------------------------
    Resin-3.0.6(builtTue,20OcT200609:46:57PST)
    查找原因:
    怎么会呢?一直运行好好的程序,开始以为程序更新上传时弄错了,检查了多次没有发现代码问题,后来逐句调试,终于找到了原因:问题出在这里
    sql="select*fromMMS_Chat_MsgLogwhere1=1orderbyID";
    prepStmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    rs=prepStmt.executeQuery();
    我这个页面是用jsp从库中查数据然后在前台分页显示,先返回ResultSet记录集,rs.last();rs.getRow();得到记录总数,然后根据查询页次和页面大小,使用rs.absolute(posion);语句设置记录游标的位置,把记录显示到页面。
    起初数据库中记录并不多,返回rs没有问题,但是随着记录增多(查了一下有20多万条吧)这样再返回rs就出问题了,即使不出错返回速度也是很慢,因为select*from要缓存所有记录。
    我把sql改了一下,="select*fromMMS_Chat_MsgLogwhere1=1orderbyIDlimit10";再次执行,OK了,页面没有报错。确定了以上就是问题原因,就是返回记录集太多,机器不干了。从网上查询了一些关于jsp分页技术介绍,也是这么说的。
    解决办法:
    如果按照网上一些例子修改起来非常麻烦,我不想对原来的代码进行大动手术。突然想到了,可以利用mysql的sql语法中limit来完成这个任务。Limit有两个参数(语法:limit参数1,参数2)参数1是记录指针位置,参数2是返回记录数。呵呵,唯一要改得地方就是:得到记录总数的方法和原来的sql后加上limit语句就OK了。
    改造如下:
    //分页显示(页次信息从用户确定页面获取)
    intpageno=1;//页次-默认第一页
    intpagesize=20;//页面显示记录数
    intpagecount=1;//页数默认1页
    intrscount=0;//记录总数
    StringpagenoStr=request.getParameter("pageno")==null?"1":request.getParameter("pageno");
    StringpagesizeStr=request.getParameter("pagesize")==null?String.valueOf(pagesize):request.getParameter("pagesize");;
    try{
    pageno=Integer.parseInt(pagenoStr);
    pagesize=Integer.parseInt(pagesizeStr);
    }
    catch(Exceptione)
    {
    pageno=1;
    pagesize=20;
    e.printStackTrace();
    out.println("
    [mms_income.jsp]finderror0:"+e.toString());
    }
    //查询用户信息
    Stringsql="";//说明:sql是根据条件动态产生的半句sql
    if(MsgFlag.equals("")){
    sql="fromMMS_Chat_MsgLogwhere1=1";
    }else{
    sql="fromMMS_Chat_MsgLogwhere1=1andMsgFlag="+MsgFlag+"";
    }
    if(!UserMobile.equals("")){
    sql=sql+"andUserMobile='"+UserMobile+"'";
    }
    sql=sql+"orderbyID";
    
    
    StringsqlTmp="selectcount(*)"+sql;rs=stmt.executeQuery(sqlTmp);
    rs.next();
    intlastRow=rs.getInt(1);
    rs.close();
    //原来的方法注释掉了
    //rs.last();
    //intlastRow=rs.getRow();//获取最后一行的行号
    
    
    这样轻松的到了记录数,下面就很简单了
    //计算分页后的总页数
    pagecount=(lastRow%pagesize==0)?(lastRow/pagesize):(lastRow/pagesize+1);
    rscount=lastRow;
    if(pageno>=pagecount)pageno=pagecount;
    intcurtRsCount=0;
    if(lastRow!=0)
    {
    intposion=(pageno-1)*pagesize+1;
    //如果要显示第pageno页,那么游标应移到posion的位置
    sql="select*"+sql+"limit"+posion+","+pagesize;//嘿嘿,这句话是新改造的
    rs=stmt.executeQuery(sql);
    }
    //下面就是显示记录的语句了。
    while(rs.next())
    {
    //显示记录信息到页面
    }
    
    
    显示页次:
    
    functionChangePage(){
    document.Form1.pageno.value=Form2.pagenoTmp.value;
    Form1.submit();
    }
    
    
    
    共<%=pagecount%>页,共<%=rscount%>条,每页<%=pagesize%>条;目前显示第<%=pageno%>页。
    <%
    intpagestart=1;
    intpagestop=1;
    
    
    pagestart=pageno-5<1?1:pageno-5;
    pagestop=pageno+5>pagecount?pagecount:pageno+5;
    
    
    for(intix=pagestart;ix<=pagestop;ix++){%>
    &;MsgFlag=<%=MsgFlag%>&;pageno=<%=ix%>><%if(ix==pageno){%><%=ix%><%}
    else{%><%=ix%><%}%>&;nbsp;
    <%}%>
    
    转到第
    
    
    
    
    
    以上只是jsp+mysql进行分页的应用,至于其他数据库(Oracle,SQLServer),如果用原始的分页方法中计算(返回记录集—跳到记录尾—获得记录数)当记录数据量大时,也会出现类似问题。
    可参考其他方法:
    解决MVC下分页显示的问题:
    pconline/pcedu/empolder/wz/jsp/0507/661142.html
    
  • 上一篇资讯: 日常SQL脚本
  • 下一篇资讯: 微软Sql参考手册
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师