簡體   English   中英

Tomcat6 Java Servlet提供mysql命令嗎?

[英]Tomcat6 Java Servlet serving mysql commands?

我玩Java和mysql已有一段時間了。 但是我第一次在Tomcat中使用它。 命令是否相同,因為據我所知,它們不起作用。

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

這是我用於連接和放置表實驗的代碼:

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)
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement 
cannot be cast to com.mysql.jdbc.Statement

您在dropTables(...)方法中使用了com.mysql.jdbc.Statement ,但是在con.createStatement()上使用了com.mysql.jdbc.Statement方法,不能單獨將它安全地轉換為MySQL。 想象一下,如果您(一天)更改了命名查詢以返回Oracle數據庫連接。 也許現在您可以了解為什么演員表本來就不安全。

使用通用的java.sql.Statement 仔細檢查您的導入並擺脫MySQL導入。 當需要支持的“下一個”數據庫出現故障時,這樣做將使您的代碼更容易處理。

您的代碼在dropTables方法中引發異常。 例外是停止執行connect方法,並阻止您關閉連接。 這樣可以防止將連接返回到連接池,從而導致連接用盡。 它還導致500錯誤。

您可以通過將dropTables更改為ClassCastException

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();
}

使用連接池(包括DBCP)時,JDBC類將圍繞本機JDBC驅動程序類進行包裝,因此您不能將Connection,PreparedStatement,Statement和...強制轉換為驅動程序的特定類,為什么要這么做?

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

只需使用標准的JDBC接口,一切都會好起來的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM