Javaアプレットからデータベースに接続する

「Java アプレット データベース」などの検索キーワードで当サイトを訪れる方が多いことには以前から気づいていた。当サイトのアクセス解析で毎月、何度か必ず見かける検索キーワードである。

けれども、どうやらJavaアプレットからDBに接続に書いた内容とは少し違うものを探しているのではないかという気がしてきたのは、今年に入ってからである。

それで、その探しているであろう内容を勝手に推測して作成したのが、Javaアプレットからデータベースに接続する(applet-db-policy.html)というページ今回のエントリである。

探している人にとって、的を射た内容になっていたならば幸い。作った甲斐があったというものである。

Excelで書いてHTML形式で出力したものなので、PC環境によっては閲覧できない可能性あり。を、ブログ移転(cocolog-nifty.comからsakura.ne.jp)に伴い、このエントリの記事として修正。

Javaアプレットからデータベースに接続する

以下のようにJavaアプレットを提供しているWWWサーバーがDBサーバーを兼ねている場合、Javaアプレットはデータベースに接続できる。

しかし、以下のようにWWWサーバーとDBサーバーが分かれている場合、JavaアプレットはDBサーバーに接続できない。

基本的にJavaアプレットがアクセスできるのは、Javaアプレットを提供しているWWWサーバーのみ。

WWWブラウザでJavaアプレットのページを表示させようとすると、たいてい正常に表示されずにJavaコンソールにスタックトレースが出力される。

Java Plug-in 1.6.0_17
	使用中の JRE のバージョン 1.6.0_17-b04 Java HotSpot(TM) Client VM
	ユーザのホームディレクトリ = C:\Documents and Settings\hoge
	----------------------------------------------------
	c:   コンソールウィンドウをクリア
	f:   ファイナライズキューのオブジェクトをファイナライズ
	g:   ガベージコレクト
	h:   このヘルプメッセージを表示
	l:   クラスローダリストをダンプ
	m:   メモリ使用率を表示
	o:   トリガログ
	q:   コンソールを非表示
	r:   ポリシー設定を再ロード
	s:   システムプロパティと配備プロパティをダンプ
	t:   スレッドリストをダンプ
	v:   スレッドスタックをダンプ
	x:   クラスローダキャッシュをクリア
	0-5: トレースレベルを  に設定
	----------------------------------------------------
	com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
	Last packet sent to the server was 0 ms ago.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
	at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:718)
	at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at javadb.DBConnectApplet.start(DBConnectApplet.java:40)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	Caused by: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.0.14:3306 connect,resolve)
	at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:404)
	at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:265)
	at com.mysql.jdbc.MysqlIO.(MysqlIO.java:280)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2026)
	... 14 more

このような場合は、Javaアプレットのセキュリティ・ポリシー(java.policy)を変更・追加することによって、データベースに接続できるようになる。

Javaアプレットのセキュリティ・ポリシーを変更・追加するには、Policy Toolを使用する。

Policy Tool(policytool.exe)は、%JAVA_HOME%\bin\配下にインストールされている。

Policy Tool(policytool.exe)を実行すると、以下のようなウィンドウが起動する。

起動したら、[ファイル]メニューから[開く]を選択する。

%java_home%\lib\security\配下のjava.policyを選択して、[開く]を押下する。

java.policyに登録されているポリシーエントリが一覧表示されるので、[ポリシーエントリの追加]を押下する。

ポリシーエントリが開いたら、CodeBaseにJavaアプレットのCodeBase属性を入力し、[アクセス権の追加]を押下する。

以下の例では “http://192.168.0.4/javadb/bin/” となる。

追加したいアクセス権を選択して、[了解]ボタンを押下する。

以下の例は、 “AllPermission” を選択する場合。

同様に必要なアクセス権を追加していって、最後に[完了]ボタンを押下する。

アクセス権は、設定手順を簡単に説明するために “AllPermission” のみとしている。

実際には、最低限必要なアクセス権のみを設定しましょう。

ポリシーエントリの一覧に追加されていることを確認する。

追加したセキュリティ・ポリシーを有効にするために、[ファイル]メニューから[保存]を選択する。

保存に成功したら、以下のようなダイアログが表示されるので、[了解]ボタンを押下する。

以上でセキュリティ・ポリシーの設定は完了しているので、設定内容を確実に反映させるためにWWWブラウザやJavaが保持しているキャッシュをクリアしておく。

以下は、Javaが保持しているキャッシュのクリア手順。詳しい説明は割愛。

WWWブラウザでJavaアプレットのページを表示させてみて、正常に表示され、Javaコンソールにもスタックトレースやエラーが出力されていなければOK。

以上です。

java.policyやアクセス権についての詳細については、別のサイトで補完してください。

というか、私に教えて欲しいw。

コメント / トラックバック1件

  1. [...] 追記: Javaアプレットからデータベースに接続する (2009/11/08追加) [...]

コメントをどうぞ