GFv2の XA を使う! PART1 前準備
今や一般的になって来た XA 、そんな現代にあっても、 XA って何?って人もいるのではないかと思うので、軽く前ふりしときます。
XA とは、分散トランザクション処理の為の標準規格で、 Java では JTA (Java Transaction API) を利用して XA を実現します。さてここで出て来た"分散トランザクション"って一体なに? って思う人もいるでしょう。ここで言う分散とは、データベースリソースが複数存在すると言うことをさしていて、世の中的にあるエンタープライズ系システムでは、複数のデータベース、乃至は複数のデータベースインスタンスに対して、クライアントから、1回のhttpリクエストでアクセスし、サーバー側では、複数のデータベース又は、データベースインスタンスに対して処理を行い、これらすべてに対して 2 Phase Commit (一括確定)を行い、httpレスポンスを返すと言うものです。
この辺は、 EJB を利用した JavaEE 標準の開発経験者であれば、当たり前の話のように聞こえてしらけるかもしれませんが、まぁもうちょっとだけお付き合いください。
それでは、 JTA を利用するメリットとは一体なんでしょうね?それを、私個人的な意見として下記します。
1、先に述べたように、複数のデータベースリソースに対して 2 Phase Commit (一括確定)ができる。
2、JDBC のデータアクセスからトランザクションを分離できるようになる。
このことにより、サーバーサイドプログラミングにおける Class 間のデータベースに関する依存関係を分離できる。
3、データアクセスの都度コネクションプールから、コネクションオブジェクトを取り出し/返却ができるようになるため、コネクション数を節約することができるようになる。
とまぁこんな具合かなと考えています。他にご意見あればどうぞ遠慮せずコメントください。
そしてこの JTA を利用するにあたり、コネクションプールに登録するデータソースドライバーも、 XA に対応するドライバーを使用する必要があります。
現在までに提供されている各 DBMS においては、 XA 対応ドライバーはほとんど実装されているようですので、かなり安心して使用できるものではないかと考えています。
(ただし、他の AppServer については、その親和性に疑問が残るものも、多少あるようです。)
それでは今回は、その XA を GlassFish v2 UR2 上で利用する為の前準備について執筆して行きたいと思います。今回の検証には、 PostgreSQL 8.2.x を使用します。
検証環境
・機種名 :iMac7,1
・CPU :Intel Core 2 Duo 2GHz
・メモリー:2G Bytes
・OS :Mac OS X 10.4.11 Tiger
・カーネル:Darwin 8.11.1
・Java :java version “1.5.0_13″
・DBMS :PostgreSQL 8.2
※ UNIX 系 OS の場合、通常はソースコンパイルインストールですが、 Mac OS X 向けのバイナリディストリビューションについては、こちらから入手可能です。インストールについてはこちらの英文サイトを参考にしてください。因に PGAdminIII についても、このサイトから入手できます。(ml 対応されてるようです。)
※Windos版については、 日本PostgreSQLユーザ会 のサイトに、バイナリーディストリビューションがありますので、それを利用できます。
それでは早速手順を以下に記載して行きます。
1、ターミナルを開いて /usr/local/pgsql/share/java にある、 postgresql-8.2-504.jdbc3.jar と postgresql.jar の二つの jar ファイルを、 /Applications/glassfish/domains/domainname/lib 配下へコピーします。
※バージョンによって .jar ファイルの数が異なる為、注意が必要です。
2、次に、 PostgreSQL の起動ユーザーへスイッチユーザーします。パスワードを聞かれるので、パスワードも入力します。
su - postgres
Password:
takeuchi-makotojo-nokonpyuta:~ postgres$
3、以下のコマンドにて、 PostgreSQL DBサーバーを起動します。
/usr/local/bin/pg_ctl -D /usr/local/pgsql/data -l postgres.log start
4、今度はPGAdmin III を開き、"×" マークがついているデータベースサーバを右クリック→"接続"をクリックします。

5、接続後、"データベース"を右クリック→"新しいデータベース"の順にクリックすると、以下のダイアログが表示されますので、必要な項目を入力して "OK" をクリックします。

※因に執筆者は、 "torutuga" と "portroyal" と言う名前のデータベースを作成しました。せっかくXA を使うのだから、複数データベースを作成するのが良いでしょう。
6、作成したデータベースに対して、それぞれ1つづつ、テーブルを作成します。あくまで検証用なので、簡単なテーブルにとどめました。因に執筆者の DDL は、以下のとおりです。
(1)torutuga に作成したテーブル BOOK_LIST のDDL
CREATE TABLE "BOOK_LIST"
(
"ISBN" "character varying" NOT NULL,
"BOOK_TITLE" "character varying",
"AUTHOR" "character varying",
"YEAR_OF_PUBLICATION" "character varying",
"PUBLISHER" "character varying",
CONSTRAINT "BOOK_LIST_pkey" PRIMARY KEY ("ISBN")
)
WITH (OIDS=FALSE);
ALTER TABLE "BOOK_LIST" OWNER TO jacksparrow;
(2)portroyal に作成したテーブル SHOPPING_CART の DDL
CREATE TABLE "SHOPPING_CART"
(
"PRODUCT_CODE" "character varying" NOT NULL,
"QUANTITY" integer NOT NULL DEFAULT 0,
"PURCHASER_NAME" "character varying" NOT NULL,
CONSTRAINT "SHOPPING_CART_pkey" PRIMARY KEY ("PRODUCT_CODE")
)
WITH (OIDS=FALSE);
ALTER TABLE "SHOPPING_CART" OWNER TO jacksparrow;
7、次に、ターミナルへ戻り、スイッチしたユーザーから一旦ログアウトして、以下のコマンドを実行し、 GlassFish を起動します。
/Applications/glassfish/bin/asadmin start-domain blackpearl
※コマンドの第二引数は、執筆者が GlassFish をインストールしてドメインを作成した時のドメイン名です。
8、Web ブラウザーを開き、 url に http://localhost:4848/ を入力してログイン画面表示後、ユーザID/パスワードを入力して管理コンソールにログインします。
9、管理コンソールにログイン後、左側のペインにある"リソース"→”JDBC”→”接続プール”の順にクリックし、右側ペインにある"新規"をクリックします。

10、以下の画面にて、接続プール名を入力し、リソースタイプには、 "javax.sql.XADataSource" を選択し、データベースベンダーには "PostgreSQL" を選択して"次へ" をクリックします。

※接続プール名には、どちらのデータベースへ接続するのか判る様な名前を付けましょう。因に執筆者は、 torutuga へアクセスすると言う意味合いで、 "XAPostgreSQLPool_torutuga" としました。
11、以下の画面の追加プロパティ、 "DatabaseName","Password","PortNumber","ServerName","User" にそれぞれ必要な値を入力し、"完了"をクリックします。

12、次に、作成した接続プールが有効となっているか、検証を行います。以下の画面の右側ペインにある "XAPostgreSQLPool_torutuga" をクリックします。

13、以下の画面右側ペインにある "ping" をクリックします。

14、以下の画面のように”ping が成功しました”と言うメッセージが表示されれば、接続プールの作成は成功です。

15、JDBC リソースへの登録を行います。以下の画面左側のペインにある、 "JDBC リソース"をクリックし、右側ペインの"新規"をクリックします。

16、以下の画面にて、 JNDI 名に、 lookup する名称を入力し、プール名に、先ほど作成した接続プールを選択して、"了解"をクリックします。

※以上で1つ目のデータベースに対するデータソースの登録までが終わりました。 JNDI 名についても、接続プール同様、どちらのデータベースへアクセスするリソースなのかわかるようにネーミングしましょう。
もうひつのデータベースに対する接続プール、データソース登録作成も、これまでにやって来た手順同様に作成します。
今回は、前準備と言うことで、データソース登録までの作業手順を執筆いたしました。
次回はいよいよ、実際にそれぞれのテーブルに対する入力フォームを用意し、レコードの登録を行うと言う簡単な WebApplication を作成して、検証して行きます。
最後にひとつだけ、 JTA を利用するにあたり、そのトランザクションの設定確認をしておく必要はあると考えます。管理コンソール左側ペインの"設定"→"トランザクションサービス"の順にクリックし、以下の画面を表示します。

デフォルトでは、"トランザクションタイムアウト"には"0"(無効)が設定されています。開発中はデバッギングとかも行う為、このままで良いでしょう。しかし運用に入った段階では、このトランザクションタイムアウトはその持続時間に考慮が必要です。その理由は、「トランザクションを利用すると言うことは、メモリーコストがかかる」と言うものがあげられます。各エンタープライズシステムの特性により、この持続時間の設定値はことなりますが、一般的に考えて、 OLTP に長時間のトランザクションを持続させるようなことをするでしょうか?
私のその応えは No! だと考えています。膨大なトラフィック量を日々処理して行くオンラインシステムを考えた時、その処理は迅速に行われて行かなければならず、それこそトランザクションに3分乃至は5分、果ては1時間なんて、ちょっと考えにくいことではないかと考えています。もしもオンラインから大量処理を要求するのであれば、それはバッチ処理との組み合わせによって実現するのがベストではないかと考えます。よって、私の中での指標値において、トランザクション持続時間は、長くても30秒程度が良いのではないかと考えています。この辺も様々なご意見あろうかと思いますので、遠慮なさらずにどうぞコメントを下さい。
| 簡単副業で収入アップ! 短期・日払い・高収入!稼げる情報満載♪ |
Comments
Pingback from jacksparrow » GFv2の XA を使う! PART2 JTA を利用した Web アプリケーションコードへの実装
Date: 2008 年 8 月 29 日, 3:08 PM
[...] 前回は、 JTA を実装した Web アプリケーションを開発するための環境を用意する記事を執筆いたしました。 今回は、いよいよ環境準備が整ったというところで、具体的に、 “どうや [...]
Pingback from jacksparrow » GlassFish v3-Prelude で、 XA を使うには?
Date: 2008 年 12 月 9 日, 12:36 AM
[...] トランザクションについては、私が以前に投稿したトピック、"GFv2の XA を使う! PART1 前準備"がありますので、そちらを参考にして下さい。 [...]



Write a comment