- - PR -
アプレット→Mysqlの接続について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-01-19 17:13
はじめまして
Ken@Java初心者です。 環境 eclipse 3.0 Mysql 4.0.15 j2sdk1.4.2_08 を使用してアプレットからMysqlに接続して 結果をブラウザ上表示するアプレットを作成 しております。 アプレットからの接続テストのため以下 import java.sql.*; import javax.swing.*; public class Jdbcsample extends JApplet { String url = "jdbc:mysql://localhost/Mydatabase"; String user = "test";//ユーザ名 String pass = "*****";//パスワード Connection con = null; public void init() { tryDB(); fin(); } //初期化 public void tryDB(){ try{ //ドライバのロード Class.forName("org.gjt.mm.mysql.Driver"); //MySQLサーバへの接続 con = DriverManager.getConnection(url,user,pass); System.out.println("Connected!!"); }catch(SQLException e){ System.err.println("SqlException:\\\\\\\\n"+e.toString()); }catch(Exception e){ e.printStackTrace(); } } //終了:開放 public void fin(){ try{ con.close(); System.out.println("Closed."); }catch(SQLException e){ System.err.println("SqlException:\\\\\\\\n"+e.toString()); }catch(Exception e){ e.printStackTrace(); } } } プログラムを書きeclipse上で実行した結果は 問題なくMysqlへ接続、開放はできました。 が、ブラウザ上でアプレットを表示させたところ、 コンソールに以下のエラーが表示され、実行することができませんでした。 java.lang.ExceptionInInitializerError at com.mysql.jdbc.Connection.<init>(Connection.java:1175) at com.mysql.jdbc.NonRegisteringDriver.connec(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at Jdbcsample.tryDB(Jdbcsample.java:26) at Jdbcsample.init(Jdbcsample.java:12) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.RuntimeException: Unable to initialize character set mapping tables at com.mysql.jdbc.CharsetMapping.<clinit>(CharsetMapping.java:73) ... 8 more eclipse上では実行できるのですが、ブラウザ上ではこのようなエラーが出てしまいます 過去のクラスパスや接続関係の質問には目を通したのですが、どうしても直すことができません。 申し訳ないのですが、打開策、指摘お願いいたします。 もしくは、この場合アプレットからMysqlへの接続は無理なのでしょうか? また、 JDBCのドライバは mysql-connector-java-3.1.12 を使用しています。 | ||||
|
投稿日時: 2006-01-20 20:49
HTMLをプログラムを変更すれば出来ますよ
下にコードを書きましたが、 archive = " MySQLのjarファイル" ここがミソです。
| ||||
|
投稿日時: 2006-01-21 08:07
アプレットから直接データベースに接続する方式はあまりみかけませんが
とりあえず、KDSさんのご指摘どおり、まずはMYSQLのJDBCドライバをパス にいれるか、またはJREのインストールフォルダのlib/extフォルダにMYSQL のJDBCドライバを設定します。 例外の原因は、 Caused by: java.lang.RuntimeException: Unable to initialize character set mapping tables at com.mysql.jdbc.CharsetMapping.<clinit>(CharsetMapping.java:73) との事ですので、そのソースを見てみましたが、 InputStream inStream = CharsetMapping.class .getResourceAsStream("/com/mysql/jdbc/Charsets.properties"); のように、jarの中のプロパティをロードしようとしてできない場合にこの例外 とさせているようです。 なぜ、ロードできないかですが、アプレットなのでポリシーファイルを書き換える 必要があるためではないかと推測しました。 どのポリシーを設定すれば動作するかまでは調べていませんが、 %USERPROFILE%\\.java.policyに以下のようなポリシーを追加すれば動作します。 grant codeBase "file:///C:/xxx/-" { permission java.security.AllPermission; }; アプレットのクラスはc:\\xxxに配置した場合です。 上記のAllPermissionはあまりよろしくないので、実用化されるときにはきちんと ポリシーを設定してください。 少しでも参考になれば幸いです。 | ||||
|
投稿日時: 2006-01-21 09:12
たぶん JDBCドライバがローカルファイルシステムからロードされているために getResourceAsStream() でセキュリティ例外がでているんでしょうね。
まず lib/ext からドライバを外して、KDS さんの仰るとおり archive とかで指定してサーバ側から JDBC ドライバを読み込むようにしましょう。 | ||||
|
投稿日時: 2006-01-21 17:21
KDS様、つばさ様、インギ様
返信ありがとうございます。 皆様が言われる通りarchiveを使用してサーバ側から ドライバを読み込み、ポリシーファイルを書き換えて 実行してみたところ問題が解決して、アプレットから MYSQLにアクセスをすることができました。 自分でも調べましたが、アプレットからデータベース にアクセスする場合、いろいろとセキュリティ関係の 問題が多いみたいであまり使われていないということが わかりました。 次回またこのようなものを作成するときは違った方法で 作成してみようと思います。 今回は未熟な自分のためにいろいろありがとうございました! 大変役に立ちました!! | ||||
|
投稿日時: 2006-01-22 13:09
別ホストにあるデータベースへ接続しているというのであればOkですが、接続先のデータベースのホストがアプレットをダウンロードしたホストと同じであればポリシーファイルの変更は必要ないと思います。
| ||||
|
投稿日時: 2006-01-23 23:19
インギ様
MYSQLのJDBCのソースでは、 -- InputStream inStream = CharsetMapping.class .getResourceAsStream("/com/mysql/jdbc/Charsets.properties"); if (inStream == null) { throw new RuntimeException("Unable to initialize character set mapping tables"); } -- となっています。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/lang/resources.html#security でJavaのClass#getResourceAsStereamの仕様をみましたが、 確かにgerResourceAsStream()をjarの中から探す場合は必ず成功する と記載されています。 でも、実際に試してみたところ .java.policyに grant codeBase "http://localhost:8080/tomcat_foo/-" { permission java.io.FilePermission "<<ALL FILES>>", "read,write"; }; と記述しないと、Kenさんの最初に記載した例外となりました。 これって、どういう事なんでしょうね。 APIのドキュメントが間違っているんでしょうか? 本題とはそれてきましたが、気になったもので、何かご存知でしたら教えてください。 試した環境は、JRE1.5.0_06です。 | ||||
|
投稿日時: 2006-01-23 23:28
すみません。
lib/extの下にまだ、mysqlのjarが いるのが原因でした。 確かに、archiveのほうを参照するようにすれば ポリシーファイルに追記しなくても動作します。 お騒がせしました。 |
1