TomcatのJNDI機能との連係(Hibernate3)
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"を設定すると,アプリケーションが主体となる.
- 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に合わせる必要がある.
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に移動した.

