我已经玩Java和mysql一段时间了。但我第一次使用它与Tomcat。命令是否相同,因为据我所知,它的命令不起作用。
到目前为止,我已经连接了,我知道这是因为它最大化了我的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)
答案 0 :(得分:2)
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement
cannot be cast to com.mysql.jdbc.Statement
您在com.mysql.jdbc.Statement
方法中使用的是dropTables(...)
,但是在con.createStatement()
上这样做是无法单独为MySQL安全转换的。想象一下,如果您(一天)更改了您的命名查找以返回Oracle数据库连接。也许现在你可以看出演员为什么天生就不安全了。
使用通用java.sql.Statement
。仔细检查您的导入并摆脱MySQL导入。这样做会使您需要支持的“下一个”数据库更容易处理代码。
答案 1 :(得分: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();
}
答案 2 :(得分:1)
使用连接池(包括DBCP)时,JDBC类将是本机JDBC驱动程序类的包装器,因此您无法将Connection,PreparedStatement,Statement和...转换为驱动程序的特定类,为什么要这样做?
某些实现具有访问本机类的方法(例如本机Oracle连接),但是您的代码将依赖于您使用的连接池。
只需使用标准JDBC接口,一切都会好的。