ファイヤープロジェクト
TomcatのJNDI機能との連係(Hibernate3)
2005-04-29T21:30+09:00   matsu
HibernateはDBとのセッション取得の方法として,JNDIを使用する方法がある.そこで,TomcatのJNDI機能を利用してDBセッションを取得する方法を試してみた.
本頁のサンプルは,前頁のサンプルをサーブレットとして修正したものである. また,今回の目標は,JNDIを使用してDBとのセッションが取得できることを確認するだけなので,サンプルのマッピングなど詳細については記述しない(※). サンプルにはantタスクwarがある. filter.propertiesにDBの設定とサーブレットコンテキストのdocBaseの設定("FILL ME"と書いてある項目)を記述しておけば, サンプルのwarを作成してくれる. これをデプロイ先に配置する.
$ vi filter.properties
$ ant init
$ ant preparelib
$ ant war
$ cp hibernatesample.war デプロイ先
次に,server.xmlにサンプル用コンテキストの記述を記述する. サンプル用コンテキストの記述は,
server.xml
に記述されているので,これをserver.xmlの適切な場所に書き写す. また,今回のサンプルはJakartaのDBコネクションプーリングライブラリであるDBCPを使用する. さらに当然ながらJDBCドライバも使用する. そこで$CATALINA_HOME/common/lib/に以下のjarを置いておく
  • commons-collections-3.1.jar
  • commons-collections-testframework-3.1.jar
  • commons-dbcp-1.2.1.jar
  • commons-pool-1.2.jar
  • pg73jdbc3.jar
これらは先の
$ ant preparelib
が成功していれば,libの下にある. あとはサーバを再起動してサーブレットにアクセスする.
# /etc/init.d/tomcat restart
$ wget http://myserver_name/fireproject/JNDISample
これでcatalina.outにサンプルの動作が出力されている.
# tail -f /var/log/tomcat4/catalina.out 
Starting service Tomcat-Apache
Apache Tomcat/4.0.3
2005-04-29 20:19:08,159 INFO  [Ajp13Processor[8009][4]] \
  cfg.Environment:460 - Hibernate 3.0
2005-04-29 20:19:08,214 INFO  [Ajp13Processor[8009][4]] \
  cfg.Environment:473 - hibernate.properties not found
2005-04-29 20:19:08,235 INFO  [Ajp13Processor[8009][4]] \
  cfg.Environment:506 - using CGLIB reflection optimizer
2005-04-29 20:19:08,245 INFO  [Ajp13Processor[8009][4]] \
  cfg.Environment:536 - using JDK 1.4 java.sql.Timestamp handling
2005-04-29 20:19:08,686 INFO  [Ajp13Processor[8009][4]] \
  cfg.Configuration:1159 - configuring from resource: /hibernate.cfg.xml
2005-04-29 20:19:08,689 INFO  [Ajp13Processor[8009][4]] \
  cfg.Configuration:1130 - Configuration resource: /hibernate.cfg.xml
...省略...
なお,このサンプルはTomcat 4.0 on Debian,PostgreSQL 7.2で動作確認した.
※ 処理内容は変えていないので,ログもほぼ同じになるはずである.
今回はTomcatがDBに接続し,WebアプリケーションはJNDIを通してそのDBとのセッションをTomcatから取得する. そこでまず,Tomcatのserver.xmlに,DBとの接続およびその方法を記述する.
上では要素Contextのみ記述した. これを要素Hostの下に記述する. まず,要素Contextの子要素に要素Resourceと要素ResourceParamsがある. これらによってTomcatはDBに接続し,その接続を該当ContextのWebアプリケーションに対してリソースとして提供する. 要素Resourceは,リソースを表す. 要素Resourceの属性について以下に示す.
name
リソース名.
type
リソースのFQCN. lookupしたリソースはここで指定したクラスのインスタンスである.
auth
リソースへの接続主体. "Container"を設定すると,Tomcatコンテナが主体となる. "Application"を設定すると,アプリケーションが主体となる.
要素ResourceParamsは要素リソースに対するパラメータである. 属性nameは,リソース名でありどのリソースのパラメータなのかを示す. 上のサンプルでの要素ResourceParamsの子要素では,以下のパラメータ設定がされている.
factory
ファクトリクラスのFQCN.
username
DBユーザ名
password
DBユーザ名のパスワード
driverClassName
ドライバクラスのFQCN.
url
DBのURL.
maxActive
活性化させる接続の最大数. 0だと無制限.
maxIdle
アイドル状態にある接続の最大数. 0だと無制限.
maxWait
使用された接続が再度使用されるまでの期間. 超えると例外となる. -1だと無期限.
アプリケーションでは,Web.xmlの設定,そしてhibernate.cfg.xmlの設定を行う. まずWeb.xml
サンプルでは
src/WEB-INF/web.xml
にある. いつもの設定である要素servlet,servlet-mappingを記述した後,さらに要素resource-refによって,先のserver.xmlのリソースをアプリケーションから参照できるようにする. 要素resourceには以下の子要素がある.
description
説明書き.
res-ref-name
リソースの参照名. 具体的にはserver.xmlで記述した要素resourceの属性nameの値である.
res-type
リソースのFQCN. たぶんserver.xmlの該当要素resourceに合わせるがある.
auth
リソースへの接続主体. "Container"を設定すると,Tomcatコンテナが主体となる. "Application"を設定すると,アプリケーションが主体となる. たぶんserver.xmlの該当要素resourceに合わせる必要がある.
あとは,hibernate.cfg.xmlである.
サンプルでは
conf/hibernate.cfg.xml
にある. ポイントは一点.
<property name="connection.datasource">java:comp/env/jdbc/hibernatesample</property>
プロパティconnection.datasourceの内容にJNDIリソース名を記述する. これはserver.xmlに記述したリソース名の前に"java:comp/env/"を追加したものである. hibernateこの値("java:comp/env/jdbc/hibernatesample")でlookupをかけ,Contextからリソースを取得する. 上位プログラムでは今までと同様
SessionFactory sessionFactory =
  new Configuration().configure().buildSessionFactory();
として,SessionFactoryを取得できる. 参考までに,上記設定に対応する今までの設定を以下に示す.
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">@DB_URL@</property>
<property name="hibernate.connection.username">@DB_USER@</property>
<property name="hibernate.connection.password">@DB_PASSWD@</property>
先に見た通り,これらの設定は,server.xmlに移動した.
matsu(C)
Since 2002
Mail to matsu