2014-03-19 137 views
-2

以下是我的代码,我正在使用JDBC,并使查询运行得更快,将PrepareStatement替换为Statement,但页面不是woking。我在做什么错?用Statement替换时,Prepared statement is not working?

代码:

<select name="city" onchange="Consituteshow(this.value)" required="required"> 
    <option value="">Select State</option> 
    <% 
     PreparedStatement stmt=null; 
     DBconnection db=new DBconnection(); 
     Connection con=db.dbConn(); 
     try{ 
      stmt = (PreparedStatement)con.createStatement(); 
      ResultSet rs = stmt.executeQuery("select distinct StateID,State from election_history;"); 
      while(rs.next()) 
      { 
    %> 
    <option value="<%=rs.getString(2)%>"><%=rs.getString(2)%></option> 
    <%  
      } 
     } 
     catch(SQLException e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      con.close(); 
      stmt.close(); 
     } 
    %> 
</select> 

我的罐子:

antlr.jar 
java-image-scaling 
mysql-connecotr-java 2.0.14 

错误:

java.lang.NullPointerException 
    at org.apache.jsp.election_005fresults_jsp._jspService(election_005fresults_jsp.java:267) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Unknown Source) 

显示内部控制台。可谁能告诉什么是错误的下面的错误?

+1

旁注:避免小脚本,使用JSTL。单独的控制器和DAO,并保持BE Servlets的逻辑 – sanbhat

+1

请花更多时间格式化您的问题。有没有必要这样滚动水平差不多这么多... –

+0

@Jon Skeet我怎样才能让我的查询运行得更快???有没有办法做到这一点? – user3332446

回答

4

是 - 你的施法会失败(有一个例外),然后你无条件finally块调用stmt.close(),即使stmt仍然是空...因此NullPointerException

基本上,不要这样做 - 使用con.prepareStatement(...)代替创建PreparedStatementcon.createStatement()根本不会创建PreparedStatement,所以稍后再投射它将无法工作。如果你真的不想使用prepareStatement,只是将您的stmt变量变为Statement而不是PreparedStatement - 但我个人建议在任何地方使用PreparedStatement

你也应该或者改进finally块来检查null调用close,或(更好)之前,如果你使用的是Java 7

+0

我怎样才能让我的查询运行得更快?有没有办法做到这一点? – user3332446

+0

@ user3332446查看http://dev.mysql.com/doc/refman/5.6/en/select-optimization.html获取一组优化技巧和技巧。 –

+0

@ user3332446:那么这是一个完全不同的问题,这肯定不会通过使用'createStatement'而不是'prepareStatement'来实现。我建议你问一个新的问题,包括所有关于你的数据库模式的相关信息,你有多少数据,它是什么类型的数据库,你执行的性能诊断等。*这个问题不是关于性能,而是关于性能正确性。 –

0

在你的代码使用使用try-与资源声明

(PreparedStatement)con.createStatement(); 

它返回Statement对象。

你需要

con.prepareStatement("query"); 

获得PreparedStatement对象