首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql服务于Tomcat6命令?

mysql服务于Tomcat6命令?
EN

Stack Overflow用户
提问于 2012-01-31 23:22:50
回答 3查看 786关注 0票数 0

我使用Java和mysql已经有一段时间了。但我第一次在Tomcat中使用它。这些命令是一样的吗,因为据我所知,哪些命令不起作用。

到目前为止,我已经连接了它,我知道这一点,因为它占用了我的mysql连接,所以我不得不关闭Tomcat。

这是我用于连接和drop table实验的代码:

代码语言:javascript
复制
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。

有什么想法吗?

提亚

下面是错误:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-31 23:27:21

您的代码在dropTables方法中引发了异常。例外情况是停止执行connect方法,并阻止您关闭连接。这可以防止连接返回到连接池,从而导致连接耗尽。这也是导致500错误的原因。

您可以通过将dropTables更改为以下内容来修复您的ClassCastException

代码语言:javascript
复制
public void dropTables(String query) throws SQLException{
    con.createStatement().executeUpdate(query);
}

另外,我建议您将JDBC代码封装在try-catch-finally块中,如下所示:

代码语言:javascript
复制
try{
    dropTables("DROP TABLE test;");
} catch (Exception e){
    e.printStackTrace();
} finally {
    con.close();
}
票数 1
EN

Stack Overflow用户

发布于 2012-01-31 23:40:51

代码语言:javascript
复制
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement 
cannot be cast to com.mysql.jdbc.Statement

您在dropTables(...)方法中使用了com.mysql.jdbc.Statement,但是在一个不能单独为MySQL进行安全强制转换的con.createStatement()上执行此操作。想象一下,如果您(有一天)更改了命名查找以返回Oracle数据库连接。也许现在你能明白为什么演员阵容本身就不安全了。

使用通用java.sql.Statement。仔细检查您的导入并删除MySQL导入。这样做将使您的代码更容易处理,当您需要支持的“下一个”数据库即将到来时。

票数 2
EN

Stack Overflow用户

发布于 2012-01-31 23:58:20

当使用连接池(包括DBCP)时,JDBC类将是原生JDBC驱动程序类的包装器,因此您不能强制转换Connection、PreparedStatement、Statement和...driver的特定类,为什么要这样做呢?

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9082071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档