有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

提供mysql命令的Tomcat6 Java Servlet?

我玩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的注释,就会得到HTTP500

有什么想法吗

短暂性脑缺血发作

以下是错误:

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)

共 (3) 个答案

  1. # 1 楼答案

    当使用连接池(包括DBCP)时,JDBC类将围绕本机JDBC驱动程序类进行包装,因此不能强制转换connection、PreparedStatement、Statement和。。。到驱动程序的特定类,为什么要这样做

    有些实现具有访问本机类的方法(例如本机Oracle连接),但您的代码将依赖于您使用的连接池

    只要使用标准的JDBC接口,一切都会很好

  2. # 2 楼答案

    您的代码在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();
    }
    
  3. # 3 楼答案

    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导入。这样做将使您的代码在需要支持的“下一个”数据库出现时更易于处理