- PR -

EJBとデータベースの関係って?

投稿者投稿内容
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2007-09-10 10:30
初めまして。現在EJBにで作成されているAPが突然ハングアップすると言うトラブルに見舞われています。私自身、EJB及びその周辺知識がないまま引き継いだため、原因の特定ができず苦慮しています。

動作環境はRHEL 4、JDK 1.4.2_04、JBoss 3.2.7にて動作し、DBはPostgreSQL7.4.15なのですが、ps axとすると、APの起動直後から以下のようなプロセスが表示されます。

4066 ? S 0:23 postgres: stats buffer process
4067 ? S 0:13 postgres: stats collector process
19589 ? S 0:00 postgres: postgres dbname xx.xx.xx.xx idle
26838 ? S 0:13 postgres: postgres dbname xx.xx.xx.xx idle in transaction

このうち、idle in transactionとあるプロセスですが、私はトランザクション処理中のためのロック状態だと理解していたのですが、そうだとするとAP起動直後にこのようなプロセスが存在すること自体がおかしいことになります。

EJBによるデータアクセスだとこのような状態になるものなのか、それともEJBの作りによるものなのか(良い作り?悪い作り?)、このプロセスが常に存在していて問題ないものなのか判断できません。またEJBによるデータアクセスだけでなく、DataSourceを取得してのデータアクセスも使用しており、この混在がトラブルの引き金になっているのかとも思っております。

この辺りのことをご存じの方がおられましたら教えていただけませんでしょうか。
スタ
会議室デビュー日: 2007/09/10
投稿数: 4
投稿日時: 2007-09-10 11:19
DataSourceがXAConnectionを使用する設定になっていないとか?
以前WAS5.0でアプリケーションのハングアップに見舞われたときは
これでした。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-09-10 11:46
そのトランザクションはコネクションプールによるものかと。
接続確認のためにクエリを発行したりするので特にナーバスになる必要は無いと思います。
まずはそのAPが突然ハングアップすると言うエラーを教えてください。
ちなみにEJBとDatasourceで別々のコネクションを取得しているのであればトランザクションがかぶってデッドロックしてる可能性があります。
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2007-09-10 12:26
# スタさん

>>DataSourceがXAConnectionを使用する設定になっていないとか?

他の部分で元々使用していたDataSourceがあったので気にしていなかったのですが、XAConnectionを使用する設定というものは行わなければならないのでしょうか。元々、このAPを開発した人もEJBやその周辺知識を熟知していたのかどうか判らないので、必要な各種設定にどのようなものがあり、どのように設定したらよいかご存じの範囲で結構ですから教えていただけませんでしょうか。

それを元に洗い直してみたいと思います。
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2007-09-10 12:36
# Anthyhimeさん

コネクションプールで"idle in transaction"になるものなんでしょうか?
コネクションプールの場合、"idle"となるものばかり思っていたので、てっきりトランザクション途中で何も処理されないまま放棄されたのかと思っていたのですが。

>>まずはそのAPが突然ハングアップすると言うエラーを教えてください。

ところがJBossのserver.logには何も残っていないのです。何かExceptionなり吐いてくれれば、どれくらいの時間に何が起こったのか判るのですが、突然Web APが反応しなくなります。ただ一度だけコンソールを閉じないままにしていたら、OSのスレッドオーバーのメッセージが表示されていました。ただ社内とは言えサービスインしているAPだったこともあり、現在は旧版にて動作させているため確認する術がありません。

今のところDataSource経由でデータベースに接続するのは参照系、更新系はEJB経由と分かれていますので、デッドロックではないと見立てております。

スタ
会議室デビュー日: 2007/09/10
投稿数: 4
投稿日時: 2007-09-10 12:38
簡単に説明すると、
EJBはトランザクション管理にJDBCではなくJTAというAPIを使用しています。
JTAベースのトランザクション管理では、XAConnectionを使用しなければならないという
ルールがあるため、結果として
EJBはXAConnectionを使用しなければ動きません。
(一部コンテナは非標準拡張をしているのでこの通りではありませんが、
EJBの標準仕様としてはこのとおりです)


>DataSourceを取得してのデータアクセスも使用しており、
たぶん、サーブレットコンテナとEJBコンテナの両方からDBアクセスをしているという
ことですよね?

推測するに、
サーブレットコンテナでは非XAConnectionをDataSource経由で使用していると思いますが、
上記の理由でこれをそのままEJBコンテナ内から使用することはできません。
別のJNDI名で、EJBコンテナ専用のコネクションプーリングを作成する必要があります。

ここら辺の設定はJBOSSの管理コンソールからできるんでないかと思います。
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2007-09-10 13:32
# スタさん

申し訳ありません。私の知識不足と説明不足から、正確な情報をお伝えできていないと思いますので、今一度構成を申し上げます。View(JSP等)部分を乗せるA ServerとEJBを乗せるB Server(PostgreSQLも含む)が稼働しており、A ServerからB ServerへはWebServiceを経由してEJB/データベースにアクセスしております。

A ServerにはStrutsフレームワークにより構築されたAPと上記WebServiceのスタブ(?)部分、B ServerにはEJBと上記WebServerの...なんと申し上げたら良いのか判りませんが、EJBとの接続部分がデプロイされており、Strutsフレームワークを利用したAPからはDataSourceを使用して直接データベースへアクセスする部分と、WebService/EJBを経由してアクセスしている部分が混在しています。ASはどちらもJBossを利用しております。

先ほどのpsの例で申し上げると

19589 ? S 0:00 postgres: postgres dbname xx.xx.xx.1 idle
26838 ? S 0:13 postgres: postgres dbname xx.xx.xx.2 idle in transaction

と言うように、接続するサーバにより別々のプーリングを利用しているように見受けられます。

スタさんが2007-09-10 12:38に投稿いただいた内容と言うのは、上記説明を加えたとしても変わりないのでしょうか?スタさんの仰る「EJBコンテナ」と言うのは、つまりJBossと言うことですよね?JBoss内からは非XAConnectionをDataSource経由で使用できないと言うことでよろしいのでしょうか?

因みにStrutsAPでのDataSourceはJNDI経由で取得せずに、直接struts-config.xmlに記述されています。
スタ
会議室デビュー日: 2007/09/10
投稿数: 4
投稿日時: 2007-09-10 13:57

>上記説明を加えたとしても変わりないのでしょうか?
struts・EJB間をWebServiceで接続したことはありませんが、
引数・戻り値がバイナリserializeされたオブジェクトかxml形式かという点を除いて
基本的には通常のEJBリモートコールと変わるところはないと思います。


A Serverで稼動しているStrutsAPは厳密にはtomcat上で動いており、
EJBモジュールでないため、非XAConnectionを使用した現状の設定で
問題なさそうです。
B ServerでEJBがDBアクセスする際にはJNDI経由でコネクションを取得していると思いますが、
そちらの設定はXAConnectionになってますか?

#A ServerではJBOSSにバンドルされたtomcatを使用してstrutsを動作させているわけですよね?
#B ServerではJBOSS上でEJBが動いているわけですよね?
#私の認識はあっていますでしょうか。


>スタさんの仰る「EJBコンテナ」と言うのは、つまりJBossと言うことですよね?
>JBoss内からは非XAConnectionをDataSource経由で使用できないと言うことでよろしいのでしょうか?

厳密には使用できないというよりは、使用してはいけないということになります。
JBoss含むEJBコンテナは、非XAConnectionを使用したビジネスロジックの動作保障がされません。

具体的にはどのような挙動を示すかはコンテナ依存でありわかりませんが、
以前私が経験したものとしては
ロジックが異常終了した場合には当該トランザクションで使用していたコネクションが破壊され、
最後はコンテナごとコアダンプを吐いて落ちるという事象がありました。

スキルアップ/キャリアアップ(JOB@IT)