2012-01-31 2 views
0

저는 자바와 mysql을 가지고 놀았습니다. 하지만 Tomcat에서 처음 사용했습니다. 명령이 작동하지 않는 명령을 말할 수 있기 때문에 동일한 명령입니까?Tomcat6 자바 서블릿 mysql 명령을 제공?

지금까지 나는 그것을 연결하고 있는데, 나는 이것을 알고 있기 때문에 나의 mysql 연결을 최대한 활용하여 Tomcat을 종료해야한다. 내가 HTTP 500

어떤 생각을 얻을, 곧 내가 dropTables의 주석으로

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); 

} 

:

이 연결 및 드롭 테이블 실험 내 코드?

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

+0

예외 또는 기타 자세한 오류 정보가 표시됩니까? Tomcat 서버 로그는 무엇을 말합니까? – fivedigit

+0

NullPointerException을 추측하고 있습니다. 또는 SQLException이 컨테이너를 중지시키고 있습니다. catalina.out에서 증거를 확인하십시오. – mcfinnigan

답변

1

당신의 코드가 dropTables 방법에 예외를 던지고있다 : 여기 TIA

는 오류입니다. 예외는 실행을 중지하고 connect 메서드를 중지하고 연결을 닫지 못하게합니다. 이렇게하면 연결이 연결 풀로 반환되지 않으므로 연결이 끊어집니다. 또한 500 오류가 발생합니다.

당신은 당신의 ClassCastException이에 dropTables을 변경하여 수정할 수 있습니다 또한

public void dropTables(String query) throws SQLException{ 
    con.createStatement().executeUpdate(query); 
} 

, 나는 당신이 당신의 JDBC 코드를 동봉하는 것이 좋습니다 시도 - 캐치 마침내과 같이 블록 :

try{ 
    dropTables("DROP TABLE test;"); 
} catch (Exception e){ 
    e.printStackTrace(); 
} finally { 
    con.close(); 
} 
+0

지금 고마워! –

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만을위한 것입니다. 오라클 데이터베이스 연결을 반환하기 위해 언젠가 이름 조회를 변경했다고 상상해보십시오. 아마도 이제 캐스트가 본질적으로 안전하지 않은 이유를 알 수 있습니다.

일반 java.sql.Statement을 사용하십시오. 수입품을 다시 확인하고 MySQL 수입품을 제거하십시오. 이렇게하면 "다음"데이터베이스를 지원해야 할 때 코드를 훨씬 쉽게 처리 할 수 ​​있습니다.

+0

일반적인 java sql 문은 무엇을 의미합니까? 내 수입은 다음과 같습니다 : import java.io.IOException; 가져 오기 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; 가져 오기 javax.servlet.http.HttpServletResponse; import com.mysql.jdbc.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; –

+2

그래서 ** import java.sql.Statement **를 가져 와서 ** import com.mysql.jdbc.Statement ** –

+0

을 가져와 주셔서 감사합니다. 휴. –

1

연결 풀 (DBCP 포함)을 사용할 때 JDBC 클래스는 원시 JDBC 드라이버 클래스에 대한 래퍼가되므로 Connection, PreparedStatement, Statement ... 등을 드라이버의 특정 클래스로 캐스팅 할 수 없으며, 왜해야합니까? 그?

일부 구현에는 네이티브 클래스 (예 : 기본 Oracle 연결)에 액세스하는 방법이 있지만 사용하는 연결 풀에 따라 코드가 달라집니다.

표준 JDBC 인터페이스를 사용하면 모든 것이 잘될 것입니다.