2012-01-31 93 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接口,一切都会好的。