2007-06-05

スタンドアロン動作中のWebアプリケーションでJNDI DataSourceを利用可能にする

以前、Jettyを使ってWebアプリケーションをスタンドアロン動作可能にするというエントリを書いた。Webアプリケーションの開発を行うさいに面倒なもののひとつに、開発チーム全員に Webアプリケーションサーバの設定を伝播するこいうものがある。Tomcatをダウンロード・展開して、Eclipseのなんとかプラグインを差し込んで、server.xmlを設定して・・・環境設定マニアならどうか知らないが、ソフトウェアアーキテクトの立場からすると、これをレクチャするというのははっきりいって何の価値も生まない作業だ。設定や操作の方法を教えるのは せいぜいSubversionだけにしたい。

ならばアプリケーションサーバもプロジェクトの一部として Subversionのリポジトリに入れてしまおう。最終成果物たる warファイルにはアプリケーション本体のみ入れるよう build.xmlを書けば良いだけの話だ。というわけで Jettyのそのような利用法を考えた次第。

方法は件のエントリを読んで貰えばいいとして、その時は JNDIのことを後回しにしていた。J2EEのきまりでは、アプリケーションがJDBC接続を得るためのデータソースはいちおう JNDIを参照して取得することになっているので(最近はDIコンテナ管理下のものを使うことも多いと思うが)、いちおう対応しておかなくてはなるまい。Jettyの JNDIを有効にするには jetty-naming-6.1.3.jar をクラスパスに追加する。

JNDIにデータソースをバインドするには、下記のようにする。(むろん、org.mortbay.jetty.Server#startを呼ぶ前に)
データソースの実装は、SpringのSingleConnectionDataSourceでも使えば良いだろう。例は Microsoft SQL Serverに接続するための設定となっている。
String dbHost = "MyDBHostForDevelopment";
String dbName = "MyDB"
String userName = "sa";
String password = "secret";
String dataSourceName = "MyDB";
SingleConnectionDataSource ds = new SingleConnectionDataSource();
ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ds.setUrl("jdbc:sqlserver://" + dbHost
+ "\\SQLEXPRESS;DatabaseName=" + dbName
+ ";SelectMethod=cursor");
ds.setUsername(userName);
ds.setPassword(password);
ds.setSuppressClose(true);
((Context)(new InitialContext().lookup("java:/comp")))
.createSubcontext("env").createSubcontext("jdbc").bind(dataSourceName, ds);
これで Webアプリケーションからは java:/comp/env/jdbc/MyDB としてデータソースを参照できる。

上記はあくまで、各個人の開発端末上で作業を行うためのコードであって、いわばアプリケーションサーバの設定ファイルにかわるものにすぎない。くれぐれも Webアプリケーションの”中に”このようなコードを書き入れないようにお願いしたい。

0 件のコメント:

コメントを投稿

<< ホーム