Springにて,HibernateのDataSourceをJNDIで取得する方法を調査してみた.
JNDIによるDataSourceの設定
Tomcatでのセキュリティ設定
Servletコンテキストの設定
デプロイと動作確認
JNDIによるDataSourceの設定
以下に本頁のサンプルのbeans.xmlを示す.
id値sampleDataSourceがポイントである. classをJndiObjectFactoryBeanとし,あとはJNDI名を指定するだけである. 本頁のポイントは以上である. あとは以下の各要素を設定すると動作確認ができる.
Springを使用したサーブレットのサンプル作成
Tomcatでのセキュリティ設定
DataSourceの設定を含むServletコンテキストの設定
デプロイと動作確認
これらのトピックはそれぞれ別頁に記述されており,本頁のサンプルではそれらを総合して動作させる.
Tomcatでのセキュリティ設定
本頁のサンプルではシステムプロパティや設定ファイルを読み込むので,PermissionErrorが発生するかもしれない. ここでの主題ではないので,ざっくりと以下のような設定を行う.
grant codeBase “file:/WEBアプリケーションのパス/-” {
permission java.security.AllPermission;
};
これはザルな設定なので,重要な環境では,必要最小限の許可のみを行うようにする. 設定ファイルは,Debianな環境では
/etc/tomcat4/policy.d/04webapps.policy
になると思う.
Servletコンテキストの設定
サンプルプログラムからは,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の取得がうまくできている.