2009-11-19 4 views
1

У меня возникли проблемы с неправильной загрузкой драйвера MySQL Connector/J в приложении Java Web Start, которое работает на Tomcat 6.0.20. Я скопировал JAR-файл соединителя MySQL в каталог lib Tomcat, а также каталог lib в webapps // WEB-INF. Я также добавил ссылку на JAR-файл внутри JNLP-файла. После небольшого исследования я обнаружил, что мне также нужно добавить узел в файл context.xml ($ CATALINA_HOME/conf), который я сделал в соответствии с синтаксисом Tomcat 6. Ниже содержимое файла XML:MySQL Connector/J Problem

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

А вот код, который я использую для доступа к базе данных:

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 

Когда я выполняю код из Eclipse, или SSH с помощью муравей , Я получаю результаты обратно очень хорошо, поэтому я знаю, что это не проблема с URL-адресом соединения. Однако, когда я запускаю его с помощью Web Start (файл jnlp), JFrame даже не открывается, когда я нажимаю кнопку. Я знаю, что это не проблема с прослушивателем событий, хотя, поскольку код отлично работает, он выполняет два других способа. Я выяснил, что исключение происходит, когда водитель регистрируется, но если я не включаю эти строки, я получаю сообщение об ошибке «Не найдено подходящего драйвера». Любые предложения относительно того, что я могу сделать, чтобы исправить эту проблему?

ответ

1

Ваша программа Java Web Start запускается на клиенте, но ваш драйвер JDBC загружается сервером Tomcat - это две разные среды, работающие в двух разных JVM.

Вы говорите, что у вас есть ссылка на ваш драйвер JDBC в вашем файле JNLP - это та часть, которую вам нужно посмотреть. Файл jar, содержащий ваш драйвер, должен быть загружен клиентом Web Start через HTTP. Я предполагаю, что это то, где цепь сломана.

Сказали, что я хочу знать, как безопасно разрешать вашим клиентам загружать драйвер JDBC и подключаться к вашей базе данных. Байткод не очень сложно перестроить, а файлы jar - это особый случай сжатия ZIP.