TomcatとMySQLの連携覚え書き

4月 4, 2010

JBoss-MySQL連携に関連して、Tomcat-MySQLのケースも書いておこう。

Tomcat経由のWebアプリからMySQLへの接続の仕組みは、JBoss(J2EEサーバ)
の場合と同じようなものになる。
TomcatはJNDI lookupという機能を利用してJDBCをデータソースとして取得することができる。

また、Tomcatはデフォルトでコネクションプーリングが可能。
CATALINA_HOME/common/lib/配下のnaming-factory.jarというjarファイルに、
以下のDBCP用ライブラリが含まれている。

Jakarta-Commons DBCP
Jakarta-Commons Collections
Jakarta-CommonsPool


これらの働きにより、Tomcat起動時にDBアクセス用のプールが形成される。

Tomcatを利用したWebアプリケーションからRDBMSに接続するための手順は、
ざっくり書くと以下のようになる。

1.JDBCドライバの入手
2.server.xmlにJNDIリソースの設定を記述
3.web.xmlにJNDIリソースを参照する設定を記述
4.JDNIルックアップを使ってデータソースを取得


名項目をもう少し具体的に書いておく。

1.JBDCドライバの入手
JBossの場合と同様、MySQLだったらConnector/Jを利用するわけだが、配置場所が変わる。
ダウンロードしたConnector/Jを解凍するとjarファイル”mysql-connector-java-5.x.x-bin.jar”
が出来るので、これをCATALINA_HOME/commom/lib/ディレクトリにコピーする。
これによりTomcatからJDBCドライバを利用することができる。

2.WebコンテキストにJDBC JDNIリソースを設定
JNDIのリソースの設定はCATALINA_HOME/conf/server.xmlの<Host>タグ内に記述する。
Context要素がすでに記述してある場合は、Resource要素とResourceParams要素を
Context要素の中に記述する。
docbase属性にはWebアプリケーションのディレクトリを、
usernameとpassword属性にはデータベースに接続可能なユーザの情報を指定する。

driverClassName属性は最初に用意したMySQL用のJDBCドライバクラス名となる。
url属性にはデータベースのURLを指定。ポート番号も指定する。
ホスト上のすべてのアプリケーションから同じデータベースを利用したい場合は、
これらを<DefaultContext>で宣言する。


<Context path="/JDBCtest" reloadable="true" docBase="/JDBCSample" workDir="/JDBCtest/work">
<Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
maxActive="150" maxIdle="50" maxWait="15000"
username="myuser" password="mypassword" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>

</Context>



3.web.xmlにJNDIリソースを参照する要素を追加
web.xmlの<web-app></web-app>の間に、コンテキストで定義したJNDIリソース
を参照する<resource-ref>要素を追加する。
このときコンテキストの<Resource>のname属性の値と、web.xmlの<res-ref-name>
要素の値が一致するようにしておく。
(要するにリソース名が共通になるように記述)


<resource-ref>
<res-ref-name>jdbc/MyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>



これにより、アプリケーション〜DBの連携が可能となり、アプリケーションから
JNDIルックアップを行いデータソースを取得することができるようになる。

4.JDNIルックアップを使ってデータソースを取得
JavaアプリにJNDIリソースを呼び出すコードを記述し、JDBC接続を行う。
コネクション取得の記述として一部のみ挙げると以下のようになる。

InitialContext initCon = new InitialContext();
JNDIリソースを見つけるネーミング操作用のInitalContextオブジェクトinitConを生成

DataSource ds = (DataSource)initCon.lookup(“java:comp/env/リソース名”);
lookupメソッドを使用し、JNDIリソースを見つける。
引数にはjava:comp/env/を相対パスとしたJNDIリソース名を指定

Connection con = ds.getConnection(); ←JNDIリソースへのコネクト
Statement stmt = con.createStatement();
SQL文をデータベースに送信するためのStatementオブジェクトstmtを生成

ResultSet result
= stmt.executeQuery(“select * from table1;”); ←SQL文の実行


なおプールするConnectionの最大値の設定等、コネクションプーリングの設定はserver.xmlで行う。
また、利用不可能になったConnectionの再利用の設定もできる。
WEBアプリが接続closeに失敗すると、そのConnectionは再び使用することができなくなり、
利用不可能なConnectionがプールの最大値に達した時にDBへの接続が不可能になってしまう
問題が発生する。これを回避するよう、利用不可能になったConnectionを再利用できるように
するにはremoveAbandonedパラメーターをtrueに設定する。

多分また追記、及び修正。

Posted by Le Blue | Categories: Tomcat |

No Responses so far | Have Your Say!

Comments are closed.