JDBC でデータベースにアクセスすることはずいぶん一般的になったような気がします。
いろいろな雑誌や本を読むと、サーバーサイド Java に関する内容であれば触れられていない方がめずらしいというかんじです。
やはりごく初期のころに比較すると、いろいろな経験が蓄積されていわゆる一般的な書き方といったものも変わってきています。
その変わってきたものの中に、データソースの使用が挙げられます。
ごく最初の頃は JDBC ドライバーをレジスターして connection オブジェクトを作成して、という例が一般的だったのですが、やはり負荷のかかる処理であり、データソースを使用するとアプリケーションサーバー等の機能であらかじめ登録してあるものを再利用してよりサーバー資源を有効に利用できるようになるために、取って代わられるようになりました。
今回は JBoss 3.2.x でのデータソースの定義のしかたと簡単なコーディングのしかたを DB2/400 での設定を例に取って紹介してみてます。
os400db2-ds.xml という名前で以下のようなファイルを作成し、サーバーの deploy
ディレクトリにコピーします。
名前は別にこの名前でなくてもかまいませんが、以下のような XML ファイルのフォーマットでJDBC
ドライバーのクラス、URL、ユーザー/パスワードなどを指定してある必要があります。
この中の <jndi-name> に指定した名前がまずサーバー上で JNDI 名になります。
getDataSource メソッドを使用して、データソースオブジェクトを取得する際は
JNDI 名を指定しますが、ここで指定した名前をそのまま使用することもできます。
後述しますが、通常はさらに設定を行って JNDI 名のマッピングを行います。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- -->
<!-- ===================================================================== -->
<!-- $Id: db2-ds.xml,v 1.1 2002/07/22 22:57:24 d_jencks Exp $ -->
<datasources>
<local-tx-datasource>
<jndi-name>jt400</jndi-name>
<connection-url>jdbc:as400://domino400</connection-url>
<driver-class>com.ibm.as400.access.AS400JDBCDriver</driver-class>
<user-name>JDBCUSER</user-name>
<password>PWD400</password>
<min-pool-size>5</min-pool-size>
</local-tx-datasource>
</datasources>
|
あわせて、指定した JDBC ドライバーのクラスにアクセスできるようにクラスパスをサーバーの
lib ディレクトリに通すか、JAR ファイルそのものをコピーするのを忘れないでください。
今回は JTOpen の JAR ファイルである jt400.jar をコピーしました。
上記の定義をコピーするとすぐにデプロイが始まります。
最後の方に JNDI 名が "java:/jt400" になった旨のメッセージがあがっているのが確認できますね。
この名前で lookup を行うことができます。

実際の使用方法ですが、順番としてはまず最初に InitialContext オブジェクトを作成します。
そしてその InitialContext オブジェクトに対して JNDI 名で lookup メソッドを実行し、戻されたオブジェクトを
DataSource オブジェクトにキャストして、データソースオブジェクトを取得します。
InitialContext ctx = new InitialContext();
return (DataSource) ctx.lookup("java:/jt400");
実際に使用する時は、たとえば以下のように getDataSource みたいなメソッドを用意しておくのがいいでしょう。
private DataSource getDataSource() throws ServletException
{
try {
InitialContext ctx = new InitialContext();
System.out.println("get InitialContext");
return (DataSource) ctx.lookup("java:/jt400");
}
catch (NamingException ne) {
throw new ServletException("Naming lookup failure: " + ne.getMessage());
}
}
取得したデータソースから connection オブジェクトを作成します。
その後は通常の JDBC のコーディングとほぼ同様です。
try {
DataSource ds = getDataSource();
Connection connection = ds.getConnection();
上に紹介したような方法では、環境によってデータソースの JNDI 名が決まり、それにあわせてデータソースの取得を行うコーディングをするような格好になってしまいます。
つまりサーバーの実行環境によってデーターソース名が異なることがあり得る以上、その場合はあわせてクラスの内容を変えなくてはいけないことになってしまいますね。アプリケーションの可搬性に問題がでてしまいます。
実際を考えると、Web アプリケーションによってアクセスするための名前は違うことが予想され、なおかつそれはサーバー側の使用するデータベースやユーザーなどによるデータソースの指定と、アプリケーション実行環境によって適切なマッピングできる必要があります。
そこでアプリケーション側でのある程度の標準化と、サーバープラットフォーム固有での、アプリケーションが期待する JNDI 名とサーバー側で定義されたデータ取得元 (まさしく"データソース"ですね) とのマッピングメカニズムが存在します。
データソースであれば、"java:comp/env/jdbc/データソース名"でアクセスするのが一般的なので、実際には以下のようなコードになるでしょう。
return (DataSource) ctx.lookup("java:comp/env/jdbc/jt400");
"java:comp/env/jdbc/..."でアクセスするためには、データソースの定義ファイルだけではなく、web.xml への変更と jboss-web.xml というファイルが追加で必要になります。
web.xml の方ではこういうサーブレットがあって、それがこういう JNDI名で、DataSource 型のオブジェクトを使用しています、という宣言というかお知らせを <resource-ref> で定義します。
web.xml のサンプルはこんなかんじです。
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<description>The standard web descriptor for the html adaptor</description>
<servlet>
<servlet-name>TestHTML</servlet-name>
<servlet-class>TestHTMLTableServletDS</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestHTML</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
<resource-ref>
<description>JDBC DataSource</description>
<res-ref-name>jdbc/jt400</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
|
データソースの定義だけですと先に見たように java:/jt400 になってしまっているので、この名前と
web.xml で指定している「こう読み込みたい」名前である "jdbc/jt400"
(実際には java:comp/env/jdbc/jt400) とのマッピングを行う必要がありますね。
これを実現するのが jboss-web.xml というファイルです。
先の web.xml とワンセットで WAR ファイルの WEB-INF の下に置きます。
web.xml の <res-ref-name> で定義した名前を <resource-ref> セクションの <res-ref-name> に設定し、データソースの定義が実際にセットしている参照名を <jndi-name> に設定します。
jboss-web.xml
<jboss-web>
<resource-ref>
<res-ref-name>jdbc/jt400</res-ref-name>
<jndi-name>java:/jt400</jndi-name>
</resource-ref>
</jboss-web>
|
web.xml で使用している JNDI名の設定を見て、jboss-web.xml で実際のデータソース名とその設定との違いを吸収する、といったかたちになっています。
ここで「実際のデータソース名」というのは JBoss 上での設定で、JBoss 上ではひとつのデータソース接続の設定に複数の
Web アプリケーションの JNDI 名を WAR 毎に異なったものでも設定できる、ということになります。
|
|