- PR -

アプレット→Mysqlの接続について

1
投稿者投稿内容
Ken
会議室デビュー日: 2006/01/19
投稿数: 2
投稿日時: 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
を使用しています。
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2006-01-20 20:49
HTMLをプログラムを変更すれば出来ますよ
下にコードを書きましたが、

archive = " MySQLのjarファイル"

ここがミソです。

コード:
<html>
<head>
<title>タイトル</title>
</head>
<body>
<applet code="Jdbcsample.class" archive ="mysql-connector-java-3.1.12-bin.jar" width="800" height="600" alt=" タイトル ">
</applet>
</p>
</body>
</html>

つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 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はあまりよろしくないので、実用化されるときにはきちんと
ポリシーを設定してください。

少しでも参考になれば幸いです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-21 09:12
たぶん JDBCドライバがローカルファイルシステムからロードされているために getResourceAsStream() でセキュリティ例外がでているんでしょうね。
まず lib/ext からドライバを外して、KDS さんの仰るとおり archive とかで指定してサーバ側から JDBC ドライバを読み込むようにしましょう。
Ken
会議室デビュー日: 2006/01/19
投稿数: 2
投稿日時: 2006-01-21 17:21
KDS様、つばさ様、インギ様

返信ありがとうございます。

皆様が言われる通りarchiveを使用してサーバ側から
ドライバを読み込み、ポリシーファイルを書き換えて
実行してみたところ問題が解決して、アプレットから
MYSQLにアクセスをすることができました。
自分でも調べましたが、アプレットからデータベース
にアクセスする場合、いろいろとセキュリティ関係の
問題が多いみたいであまり使われていないということが
わかりました。
次回またこのようなものを作成するときは違った方法で
作成してみようと思います。

今回は未熟な自分のためにいろいろありがとうございました!
大変役に立ちました!!
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-22 13:09
別ホストにあるデータベースへ接続しているというのであればOkですが、接続先のデータベースのホストがアプレットをダウンロードしたホストと同じであればポリシーファイルの変更は必要ないと思います。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 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です。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2006-01-23 23:28
すみません。
lib/extの下にまだ、mysqlのjarが
いるのが原因でした。

確かに、archiveのほうを参照するようにすれば
ポリシーファイルに追記しなくても動作します。

お騒がせしました。
1

スキルアップ/キャリアアップ(JOB@IT)