JBossのMySQL設定
JBoss-MySQL連携時に必要な設定をまとめてみた。
mysqlコンフィグレーション領域の作成
JBossにはコンフィグレーション領域というディレクトリがある。
これはJBossの起動単位となる領域で、サーブレットやEJB、データソース定義ファイル、
各種jarファイルが置かれている。
初期状態ではall、default、minimalの3種類のコンフィグレーション領域がサンプル
として用意されている。MySQL用の領域作成のためにはdefaultディレクトリをコピーし、
それをmysqlコンフィグレーション領域とすればよい。
defaultコンフィグレーション領域は、”HSQLDB”というDBをデフォルトデータソースと
して使用する。これをMySQLに変更するために、以下の手順を実行する。
1.コピーしたコンフィグレーション領域ディレクトリに移動後、
以下のファイルをrmで削除する。
deploy/hsqldb-ds.xml ←データソース定義ファイル
deploy/jms/hsqldb-jdbc2-server.xml ←JMSのデータソース定義ファイル
lib/hsqldb.jar ←HSQLDBのドライバファイル
lib/hsqldb-plugin.jar
2.Connecotor/Jを配置する。
mysqlコンフィグレーションディレクトリ直下のlibに、Connecotor/Jのjarファイルをコピー。
3.データソース定義ファイルを作成する。
mysqlコンフィグレーションディレクトリ直下のdeployに、MySQLデータソース定義ファイル
となるmysql-ds.xmlを置く。詳しい内容は省略するが、ここにはロードするドライバクラス名、
Connecotor/Jの接続パラメータ、CMP 2.0の設定などをXML形式で既述する。
connectionの最大プールサイズは<max-pool-size>要素により定義する。
4.JMSストア定義ファイルの変更
JMSメッセージの保存先をMySQLにするための設定ファイルを配置。
MySQL用JMSストア定義ファイルのサンプルが存在するので、これをコピーして使うとよい。
具体的にはJBossインストールディレクトリ配下、docs/examples/jms/mysql-jbdc2-server.xmlを、deploy/jmsにコピーする。
このファイル内では次の修正が必要となる。
name=MySqlDS
↓ ↓ ↓
name=DefaultDS
これらの設定により、JBossのデフォルトデータソースがMySQLとなる。
ここからJBossの起動に移る。MySQLが先に起動済みとなっていること。
JBossインストールディレクトリ配下のbinに移動してから起動を実行する場合、
以下のように。
$ ./run.sh -c mysql
-cオプションでコンフィグレーション領域を指定している。JBoss起動時においてはMySQLへの
接続や、JMS関連のテーブル作成を実行している。
ということは、この時に前回書いたコネクションプールが生成されている、というわけだ。
MySQLとの連携が成功したかどうかの確認は、以下の点をチェック。
1.JBossの起動ログに例外(exception)が出ていないか
2.MySQL上に以下のJBoss関連のテーブルが作成されているか
HILOSEQUENCES
JMS_MESSAGES
JMS_ROLES
JMS_SUBSCRIPTIONS
JMS_TRANSACTIONS
JMS_USERS
TIMERS
後はテスト用のファイルを作成して配置し、WEBブラウザ上での確認、つまりアプリケーションから
の接続確認なども必要になるが、ここでは割愛。
Connectionが無効になるケース
システムの状態によってはプールしておいたConnectionが使えなくなるケースがあるため、
注意が必要。例えば以下のようなケース。
JBossは稼働したまま、MySQLだけ再起動した場合
一定時間そのConnectionを使用しなかった場合
KILL文でConnectionを切断した場合
この状態の時に使えなくなったConnectionを用いてMySQLにアクセスを試みると、
接続できずに例外(exception)が返ってきてしまう。
無効なConnectionを検知する
J2EEサーバとConnector/Jを組み合わせた環境では、無効になったConnectionの発生をデフォルト
では検知しないが、J2EEサーバ側の設定でコネクションの有効性を自動確認するようにできる。
JBossの場合、mysql-ds.xmlに以下を追記する。
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
※<min-pool-size>要素の前に追記
これにより、プールからConnectionを取得する際に「SELECT 1」というSQL文をMySQLに
発行するようになり、Connectionが無効になってた場合はSELECT 1の発行により検知できる。
その際はConnectionを破棄して再接続を行うため、アプリケーション側には例外が発生しない。
他にも書き加えることが山ほどありそうだが、今回はこの辺りで切り上げよう。
主な出典
「現場で使えるMySQL」松信嘉範著
補足
途中で出て来た「CMP 2.0」について。
CMPはEntity Bean(EJB)の一種で、Container Managed Persistence (コンテナ管理の永続性)の略。
「コンテナ管理の永続性」って言われても自分的には「???」なのだが、、、
「永続化に関する処理をEJBコンテナが行う」という意味だそうである。
CMPでは開発者はDBなどのリソースへのアクセスのためのコードを書く必要がなく、
リソースとのやり取りはすべてEJBコンテナが行う。
これに対してBMPというのもある。
これはBean Managed Persistenceの略で、永続化に関する処理をBean自身が行う。
リソースへのアクセスコードはすべてアプリケーション開発者が記述する必要があり、実装はCMPよりも手間が掛かかる反面、CMPより適用範囲が広く
自由度も高くなる、ということらしい。
ちなみにJBossはデフォルトでCMP 2.0をサポートしている。