求提升jsp页面响应时间的办法

这是一个servlet,作用是调取数据库的某些数据存放到一个集合里

        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://";
            String username = "test";
            String password = "123456";
            Connection conn = DriverManager.getConnection(url, username, password);
            Statement stmt = conn.createStatement();
            String sql = "select FI_FisherName from newshipinfo";
            ResultSet rs = stmt.executeQuery(sql);
            List<DetectItem> list2 = new ArrayList<DetectItem>();
            while(rs.next()){
                DetectItem dct = new DetectItem();
                dct.setFI_FisherName(rs.getString("FI_FisherName"));
                list2.add(dct);
            }
            request.setAttribute("list2", list2);
            rs.close();
            stmt.close();
            conn.close();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }
        request.getRequestDispatcher("project.jsp").forward(request, response);
    }

这个是读取数据显示的页面

 <select name="dId" id="dId" class="selectpicker bla bla bli" data-live-search="true" size="1">
                <%
                    List<detection> list = (List<detection>)request.getAttribute("list");
                        if(list ==null || list.size() < 1){
                            out.print("没有数据!");
                        }else{
                            for(detection dct :list){
                                %>
                                <option value="<%=dct.getFI_FisherName()%>"><%=dct.getFI_FisherName()%></option>
                                <%
                            }
                        }

                    %>
            </select>

现在每次页面响应时间都很长,感觉每次运行它都要去数据库里把数据放到集合里。数据库里也只有3000左右条数据。每次提交完数据返回时也要拖很长的时间。我想问有没有什么办法能提高响应时间?能不能把数据缓存到服务器,要调用的时候直接去服务器里调,就不去数据库里一次次的访问封装到集合了。

 如果查询出来的list数据量不大,可以放在session里

HttpSession hs=request.getSession();
hs.setAttribute("list",list2);
下次使用用
List<DetectItem> list = (List<DetectItem>)hs.getAttribute("list");

还是不建议将数据放在init()方法里面,如果仅仅只是用来测试或者自己测试还行

init()方法他在servlet初次创建时被调用,之后处理每个用户的请求时,则不在调用这个方法
例如 登录校验验证码可以 校验写在servlet 的init() 方法中
可以将他理解为一个简单过滤器

今天稍微学习了一下 Servlet,Servlet 主要有以下几个方法:
1) destroy()
2) getServletConfig()
3) getServletInfo()
4) init(ServletConfig arg0)
5) service(ServletRequest arg0, ServletResponse arg1)

destroy 和 service 方法的调用时刻很明显,关键这个 init 方法的调用时刻不是很清楚,遂经过百度和一番实验后得出了结论。

init 方法的执行时刻其实与 servlet 的配置有关,可以看到以下代码的load-on-startup结点,如果结点的值大于等于 0,则在 Servlet 实例化的时候执行,间隔时间由具体的值决定,值越大,则越迟执行。如果小于 0 或者没有配置,则在第一次请求的时候才同步执行 , 注意 init 方法只执行一次


helloServlet
javaweb.HelloServlet
1


helloServlet
/hello

1

总结

init 方法是随 Servlet 实例化而被调用的,因为 load-on-startup 就是用来设置 Servlet 实例化时间的。

因此,init 方法执行的时刻有两种:

(1) load-on-startup 的值大于等于0,则伴随 Servlet 实例化后执行。

(2) load-on-startup 的值小于0 或者 不配置, 则在第一次 Servlet 请求的时候执行。

 java:
HttpSession hs=request.getSession();
hs.setAttribute("list",list2);

JSP页面:
<%
                    List<detection> list = session.getAttribute("list"); 
                        if(list ==null || list.size() < 1){
                            out.print("没有数据!");
                        }else{
                            for(detection dct :list){
                                %>
                                <option value="<%=dct.getFI_FisherName()%>"><%=dct.getFI_FisherName()%></option>
                                <%
                            }
                        }

                    %>

做一个select下拉框没必要把3000行记录都取出来啊,
那么多记录全取出来你也不看不过来吧,
只取前10条不行吗?

String sql = "select FI_FisherName from newshipinfo limit 0,10 ";
  1. 使用数据库连接池
  2. 优化sql语句
  3. 换一种返回方式,jsp页面通过ajax获取json数据,然后展现