Tomcat6 Java-сервлет, обслуживающий команды mysql? - PullRequest
0 голосов
/ 31 января 2012

Я играл с 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.

Есть мысли?

1012 * ТИА *

Вот ошибка:

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 ]

2 голосов
/ 31 января 2012
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 голос
/ 31 января 2012

При использовании пула соединений (включая DBCP) классы JDBC будут обертками вокруг собственных классов драйверов JDBC, поэтому вы не можете приводить Connection, PreparedStatement, Statement и ... к определенным классам драйвера, и зачем вам это делать?

В некоторых реализациях есть методы для доступа к собственным классам (например, к собственному соединению Oracle), но тогда ваш код будет зависеть от используемого вами пула соединений.

Просто используйте стандартные интерфейсы JDBC, и все будетбудь в порядке.

1 голос
/ 31 января 2012

Ваш код вызывает исключение в методе 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();
}
...