JNDIにてDataSourceを取得する設定(Spring1.2.1)
Springにて,HibernateのDataSourceをJNDIで取得する方法を調査してみた.
以下に本頁のサンプルのbeans.xmlを示す.
id値sampleDataSourceがポイントである.
classをJndiObjectFactoryBeanとし,あとはJNDI名を指定するだけである.
本頁のポイントは以上である.
あとは以下の各要素を設定すると動作確認ができる.
- Springを使用したサーブレットのサンプル作成
- Tomcatでのセキュリティ設定
- DataSourceの設定を含むServletコンテキストの設定
- デプロイと動作確認
本頁のサンプルではシステムプロパティや設定ファイルを読み込むので,PermissionErrorが発生するかもしれない.
ここでの主題ではないので,ざっくりと以下のような設定を行う.
grant codeBase "file:/WEBアプリケーションのパス/-" {
permission java.security.AllPermission;
};
これはザルな設定なので,重要な環境では,必要最小限の許可のみを行うようにする.
設定ファイルは,Debianな環境では
/etc/tomcat4/policy.d/04webapps.policyになると思う.
サンプルプログラムからは,ServletコンテキストからJNDI名
java:comp/env/jdbc/springsampleにてDataSourceを取得しようと試みる. そこで,Servletコンテキストにて,上記JNDI名でDataSourceを生成するよう設定しなければならない. servelet.xmlに以下のように設定する.
<Context path="${webapp.contextpath}" docBase="${webapp.docbase}" debug="5" reloadable="true">
<Resource name="jdbc/springsample" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/springsample">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- DBCP database connection settings -->
<parameter>
<name>username</name>
<value>${db.username}</value>
</parameter>
<parameter>
<name>password</name>
<value>${db.password}</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>${db.driver}</value>
</parameter>
<parameter>
<name>url</name>
<value>${db.url}</value>
</parameter>
<!-- DBCP connection pooling options -->
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>100</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>3000</value>
</parameter>
</ResourceParams>
</Context>
${...}は各環境に応じて設定する.
ここでの注意点は,beans.xmlのid値dbConfのbeanで設定した設定ファイルのパスが,${webapp.docbas}と整合がとれていなければならない点である.
私の環境では,これは絶対パスでは${HOME}/webapps/springsample/WEB-INF/conf/db.confとなった.
紛らわしければ,設定を絶対パスにしてしまった方がすっきりするかもしれない.
まず,warファイルを作成する.
$ ant warできあがるspringsample.warを,先でservlet.xmlで設定した${webapp.docbase}に配置する. あとは,初期設定では/tmp/spring_sample.logにログが出力される. 前頁と同様なログが出力されていれば,DataSourceの取得がうまくできている.

