这是一个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
总结
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 ";