はい、あたいらしく技術系のお話。いやね、昨日から今日にかけてこの部分に四苦八苦したからなのさ。今使っているのがTomcat 6.xのバージョンで、JNDIを用いたDB接続を調べても出てくるのはどれも旧バージョンのものばかり。というわけで、こうやったらできたよー、という情報。
まず、Tomcatを用いたウェブアプリケーション、というかJavaでサーブレットやらなんやらが関わるアプリケーションの場合は、こんな感じのディレクトリ構成になっているわけで。
webapps
webapps/root
webapps/root/
webapps/root/WEB-INF
webapps/root/WEB-INF/classes
webapps/root/WEB-INF/lib
webapps/root/WEB-INF/web.xml
webappsはTomcatのアプリケーションが配置されるディレクトリで、warファイルはこの直下に配置するのが基本だと思う。
rootが各アプリケーションのルートとなるファイル。この部分はアプリケーションによって名前が異なる。rootの下のディレクトリにHTMLやJSPなどのファイルを設置して、さらにディレクトリを追加することも可能。
WEB-INFはwebアプリのロジック部分が入る部分で、classesディレクトリには動作するJavaクラスファイル、libには外部ライブラリファイル、web.xmlがアプリケーション動作を決定するディプロイメント指定ファイル。
各ディレクトリの名前については、rootと任意につけられたディレクトリを覗いて固定。
しかーし! JNDIを用いでデータベース接続をしようとするなら、これでは足りないわけさ。このときはこのような構成にしないとダメ。
webapps
webapps/root
webapps/root/
webapps/root/WEB-INF
webapps/root/WEB-INF/classes
webapps/root/WEB-INF/lib
webapps/root/WEB-INF/web.xml
webapps/root/META-INF
webapps/root/META-INF/context.xml
rootディレクトリの下にMETA-INFというディレクトリができ、その下にcontext.xmlというファイルが配置される状態。そしてこれこそ、JDNIを実現するに必要な部分なわけであるさ。context.xmlにデータベース接続に必要なパラメータを設定するのであるよ。
因みにこのディレクトリ構成、eclipseだと最初からこうやって生成されるよね。HTMLとかJSPはWebContentsディレクトリに配置されるぐらいかな。ただし、META-INF以下にcontext,xmlは生成されないけれど。
ここであれ、戸思った人はいろいろ調べた人。Tomcatとしてはwebappsと同レベルのディレクトリであるconf/以下、conf/Catalina/localhost/XXXX.xmlがコンテキスト設定ファイルとして用いられるから。でも安心、XXX.xmlに当たる該当ファイルが存在しなければ、META-INF/contect.xmlがコンテキスト設定ファイルとして配置される動きとなっている。依然に方法とされていたserver.xmlファイルはいじる必要がないのですよ。
さて、配置する場所が分かったところで、パラメータはどう設定するか、という点。これも旧バージョンと全く形式が変わっているわけで。
ただし、ここにあるのは一例なので、詳しくはBDCPの説明しているサイトを閲覧してくださいな。厳密にはあれだけれども、まあ、形式としてはこのような感じでつくればいいかな。
http://limy.org/program/java/commons_dbcp.html
<?xml version="1.0" encoding="utf-8" ?>
<Context reloadable="true">
<Resource
name="JNDI登録名"
auth="Container"
type="javax.sql.DataSource"
username="DBログインユーザ"
password="usernameに対応するパスワード"
driverClassName="JDBCドライバ名"
url="JDBC接続文字列"
maxActive="同時接続最大数"
maxWait="接続が最大数に達している時に利用可能となる時間(ミリ秒)"
maxIdle="プールに存在可能なアイドル接続数"
defaultAutoCommit="オートコミットの設定"
timeBetweenEvictionRunsMillis="監視スレッド動作間隔(ミリ秒)"
/>
</Context>
これをcontext.xmlに保存してください。今回はMySQLを利用したのですが、調べても答えが出ないということもあり、FireBirdというRDBMSのJDBCドライバ名(JayBird)と接続文字列をついでに残しておきますね。
FireBird
ドライバ名:org.firebirdsql.jdbc.FBDriver
接続文字列:jdbc:firebirdsql:[localhost | IP]/3050:[ファイルパス | エイリアス]
ドライバ名はJayBirdのもの。
接続文字列について、FireBirdは3050番ポートを使用するので。あと、ファイルパスについてはC:\~のやつでFBのデータベースファイルまでのフルパスを指定すれば大丈夫。あるいはあらかじめエイリアスを設定するか。
今度は配置されたら外部に出てしまうcmotext.xmlの内容を内部で参照できるようにしておかなければなりません。そこで、内部でのコンテキストファイルであるweb.xmlにマークアップを追加します。
<resource-ref>
<res-ref-name>JNDI登録名</res-ref-name>
<res-type>javax.sql.DataSource</res-type>]
<res-auth>Container</res-auth>
</resource-ref>
なお、この<resource-ref>ブロック要素は<servlet-mapping>よりも後ろで設定する必要があるようです。
この設定を完了すれば、残るはサーブレットサイドでのDataSourceオブジェクトを用いたConnection取得、となるわけですが、これ以降については旧バージョンのものと同じソースなので、ここでは割愛します。
そしてできたアプリケーション一式はWARファイルにして配置、そうしてからTomcatを起動させればWARファイルから各データが配置されて、きっちり動作するようになるんさ。
これを解決するのに一日以上時間がかかったわけだよ。うー疲れたー
[0回]
PR