2014-03-19 136 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對象