2012-01-31 91 views
0

我一直在玩Java和MySQL一段時間。但我第一次和Tomcat一起使用它。命令是一樣的,因爲據我可以告訴它的命令不工作。Tomcat6 Java Servlet服務mysql命令?

到目前爲止我已經連接了,我知道這是因爲它最大化了我的mysql連接,所以我必須關閉Tomcat。

這是我的連接和DROP TABLE實驗代碼:

public void connect() throws SQLException, NamingException{ 

    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
    DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    con = ds.getConnection(); 

    dropTables("DROP TABLE test;"); 

    con.close(); 
} 


public void dropTables(String query) throws SQLException{ 

    Statement st = (Statement)con.createStatement();   
    st.executeUpdate(query); 

} 

只要我去掉了dropTables,我得到HTTP 500

有什麼想法?

TIA

以下是錯誤:

SEVERE: Servlet.service() for servlet myServlet threw exception 
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement cannot be cast to com.mysql.jdbc.Statement 
    at myServlet.dropTables(myServlet.java:90) 
    at myServlet.connect(myServlet.java:82) 
    at myServlet.doPost(myServlet.java:50) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    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.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    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:298) 
    at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:431) 
    at org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpAprProtocol.java:384) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665) 
    at java.lang.Thread.run(Thread.java:662) 
+2

HTTP 500是一個內部服務器錯誤,可能意味着存在未處理的異常。你有沒有堆棧跟蹤? – Dave 2012-01-31 15:25:05

+0

它是否顯示任何異常或更詳細的錯誤信息? Tomcat服務器日誌說什麼? – fivedigit 2012-01-31 15:25:10

+0

我猜NullPointerException或SQLException正在關閉你的容器。檢查你的catalina.out的證據。 – mcfinnigan 2012-01-31 15:26:24

回答

1

你的代碼是在dropTables方法拋出異常。例外是暫停執行,connect方法和阻止您關閉連接。這可以防止連接返回到導致連接用完的連接池。它也造成了500錯誤。

您可以修復你的ClassCastException通過改變dropTables這樣:

public void dropTables(String query) throws SQLException{ 
    con.createStatement().executeUpdate(query); 
} 

另外,我建議你在一個封裝JDBC代碼的try-catch-finally塊,像這樣:

try{ 
    dropTables("DROP TABLE test;"); 
} catch (Exception e){ 
    e.printStackTrace(); 
} finally { 
    con.close(); 
} 
+0

現在就工作,謝謝! – 2012-01-31 16:33:56

2
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement 
cannot be cast to com.mysql.jdbc.Statement 

您在您的dropTables(...)方法中使用com.mysql.jdbc.Statement,但在con.createStatement()上這樣做不能安全地投射僅用於MySQL。想象一下,如果你(有一天)改變你的命名查找來返回Oracle數據庫連接。也許現在你可以看到爲什麼演員本身就是不安全的。使用通用的java.sql.Statement。仔細檢查您的導入並擺脫MySQL導入。這樣做會使你的代碼更容易處理,當你需要支持的「下一個」數據庫出現問題時。

+0

你是什麼意思的通用Java的SQL語句?我的導入如下所示: import java.io.IOException; import java.io.OutputStreamWriter; import java.net.URLDecoder; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mysql.jdbc.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; – 2012-01-31 15:47:26

+2

所以只需**導入java.sql.Statement **並刪除**導入com.mysql.jdbc.Statement ** – 2012-01-31 15:55:38

+0

感謝它現在的工作。唷。 – 2012-01-31 16:33:38

1

當使用連接池(包括DBCP)時,JDBC類將包裝原生JDBC驅動程序類,所以您不能將Connection,PreparedStatement,Statement和...轉換爲驅動程序的特定類,爲什麼要這樣做那?

某些實現具有訪問本機類(例如本機Oracle連接)的方法,但隨後代碼將依賴於您使用的連接池。

只要使用標準的JDBC接口,一切都會好的。