2009-11-19 4 views
1

그래서 Tomcat 6.0.20에서 실행중인 Java Web Start 응용 프로그램에서 MySQL Connector/J 드라이버가 올바르게로드되지 않는 문제가있었습니다. MySQL connector JAR 파일을 webapps // WEB-INF 내의 lib 디렉토리와 Tomcat의 lib 디렉토리에 복사했습니다. 또한 JNLP 파일 내부의 JAR 파일에 대한 참조를 추가했습니다. 조금 연구 한 후에 context.xml 파일 ($ CATALINA_HOME/conf)에 노드를 추가해야한다는 것을 알았습니다. Tomcat 6 구문에 따라이 작업을 수행했습니다. 다음은 XML 파일의 내용입니다 :MySQL 커넥터/J 문제

<Context> 

    <!-- Default set of monitored resources --> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 

    <!-- Uncomment this to disable session persistence across Tomcat restarts --> 
    <!-- 
    <Manager pathname="" /> 
    --> 

    <!-- Uncomment this to enable Comet connection tacking (provides events 
    on session expiration as well as webapp lifecycle) --> 
    <!-- 
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> 
    --> 

    <Resource name="jdbc/MySQLDB" auth="Container" driverClassName="com.mysql.jdbc.Driver" 
maxActive="10" maxIdle="1" maxWait="500" type="javax.sql.DataSource" 
url="jdbc:mysql://myServerName:3306/myDbName" username="myUserName"  
password="myPassword>" /> 

</Context> 

을 그리고 여기가 데이터베이스에 액세스하는 데 사용하고 코드입니다 : 나는 개미를 사용하여 이클립스 또는 SSH에서 코드를 실행하면

Connection con = null; 
try { 
     sb.append("\nAbout to register JDBC driver\n"); 
     Driver driver=new com.mysql.jdbc.Driver(); 
     DriverManager.registerDriver(driver); 

     sb.append("About to create new instance of mysql jdbc driver\n"); 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 

    } catch (InstantiationException e) { 
     sb.append(e.getMessage()); 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     sb.append(e.getMessage()); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     sb.append(e.getMessage()); 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     sb.append(e.getMessage()); 
     e.printStackTrace();  
    } catch (Exception e) { 
     sb.append(e.getMessage()); 
     e.printStackTrace(); 
    } // end try-catch 

try { 
    sb.append("About to create connection using DriverManager\n"); 

    con = DriverManager.getConnection("jdbc:mysql://myServerName:3306/myDbName","myUserName", "myPassword"); 

    // Make sure that connection instance isn't null before creating statement and executing query. 
    if (con != null) { 
    sb.append("About to create SQL statement using con.createStatement\n"); 
    Statement st = con.createStatement(); 
    sb.append("About to create ResultSet by executing query"); 
    ResultSet rs = st.executeQuery("SELECT * FROM catissue_user"); 

    sb.append("About to loop through ResultSet\n"); 

    while(rs.next()) { 
     sb.append(rs.getString(2)); 
    } // end of while 

    sb.append("\nAbout to close ResultSet, Statement and connection\n"); 
    rs.close(); 
    st.close(); 
    con.close(); 
    } else { 
    sb.append("There was a problem creating the connection:\n"); 
    } // end if 
} catch(SQLException exception) { 
    sb.append(exception.getMessage()); 
    exception.printStackTrace(); 
} catch(Exception exception) { 
    sb.append(exception.getMessage()); 
    exception.printStackTrace(); 
} // end try-catch 

을 , 결과가 정상적으로 반환되므로 연결 URL에 문제가 없다는 것을 알고 있습니다. 그러나 Web Start (jnlp 파일)를 사용하여 실행하면 단추를 클릭해도 JFrame이 열리지 않습니다. 나는 이벤트 리스너에 문제가 없다는 것을 안다. 왜냐하면 코드가 다른 두 가지 방식으로 잘 동작하기 때문이다. 나는 드라이버가 등록 될 때 예외가 발생하지만 그 라인을 포함하지 않으면 "No suitable driver found."라는 오류 메시지가 나타납니다. 이 문제를 해결하기 위해 내가 할 수있는 것에 대한 제안 사항이 있습니까?

답변

1

Java Web Start 프로그램은 클라이언트에서 실행되지만 JDBC 드라이버는 Tomcat 서버에 의해로드됩니다. 두 개의 서로 다른 JVM에서 실행되는 두 개의 다른 환경입니다.

당신은 JNLP 파일에 JDBC 드라이버에 대한 참조가있다 -이 부분을 살펴 봐야한다. 드라이버가 들어있는 jar 파일은 HTTP를 통해 Web Start 클라이언트에서 다운로드 할 수 있어야합니다. 나는 이것이 체인이 고장난 부분이라고 추측한다.

그렇다면 클라이언트가 JDBC 드라이버를 다운로드하고 데이터베이스에 연결할 수 있도록하는 것이 안전 할까합니다. 바이트 코드는 엔지니어를 리버스하기가 대단히 어렵지는 않습니다. jar 파일은 Zip 압축의 특별한 경우 일뿐입니다.