1

そのため、Tomcat6.0.20で実行されているJavaWebStartアプリケーションにMySQLConnector/Jドライバーが正しくロードされないという問題が発生しています。MySQLコネクタのJARファイルをTomcatのlibディレクトリとwebapps//WEB-INF内のlibディレクトリにコピーしました。また、JNLPファイル内にJARファイルへの参照を追加しました。少し調べてみると、context.xmlファイル($ CATALINA_HOME / conf)にノードを追加する必要があることがわかりました。これは、Tomcat6の構文に従って行いました。XMLファイルの内容は次のとおりです。

<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からantを使用してコードを実行すると、結果が正常に返されるので、接続URLの問題ではないことがわかります。ただし、Web Start(jnlpファイル)を使用して実行すると、ボタンをクリックしてもJFrameが開きません。ただし、コードは他の2つの方法で正常に実行されるため、イベントリスナーには問題がないことはわかっています。ドライバーの登録時に例外が発生することがわかりましたが、これらの行を含めないと、「適切なドライバーが見つかりません」というエラーが表示されます。この問題を解決するために私ができることについて何か提案はありますか?

4

1 に答える 1

1

Java Web Start プログラムはクライアント上で実行されますが、JDBC ドライバーは Tomcat サーバーによってロードされます。これらは、2 つの異なる JVM で実行される 2 つの異なる環境です。

JNLP ファイルに JDBC ドライバーへの参照があるとおっしゃっていますが、これは確認する必要がある部分です。ドライバーを含む jar ファイルは、Web Start クライアントが HTTP 経由でダウンロードできる必要があります。ここで鎖が切れたのだと思います。

そうは言っても、クライアントが JDBC ドライバーをダウンロードしてデータベースに接続できるようにすることの安全性について疑問に思っています。バイトコードのリバース エンジニアリングはそれほど難しくなく、jar ファイルは zip 圧縮の特殊なケースにすぎません。

于 2009-12-01T19:34:53.327 に答える