クラスタリング検証 続報2

Stateful Session Bean と CMP Entity Bean のクラスタリングを検証した.

SFSBは全く問題なく成功.しかしCMPは簡単には行かなかった.単にデータソースの追加とか使用データソースの変更とかやったことない作業が入ったのもあるけど,CMPについては単に「負荷分散されました,めでたしめでたし〜」ではなくて,「クラスタリングで負荷分散されるとトランザクション管理はどうなるの?」というのも明らかにしないといけなかったから.

結論からいうとクラスタを使うとJTAによるトランザクション管理機能は利用できない.JTAクラスタ対応していないから.オブジェクト・レベルでの排他制御はできないってこと.でもだからといってEntity Beanのクラスタはできないじゃん,というわけでも無い.じゃあどうするかというと,データベースに頼る.あとキャッシュを使うのを止める.分散キャッシュはJBoss4.xからみたいなのでどっちにしろクラスタ使う=キャッシュは諦める,となるわけだけど.

JBossには全てのSelect文にfor Updateが暗黙的に付加されるモードが用意されている.これをつかってfor Updateによる行排他ロックを使って,データベースレベルで排他制御を行い,そしてキャッシュを行わないことで必ず行排他ロックの影響を受けるようにさせることで複数ノード間のトランザクションの整合性を取るというのがデータベースに頼る方法その一.もう一つはトランザクション分離レベルをSerializableにすることってドキュメントには書いてあるけど,実際問題,同じSerializableという名前のモードでも振る舞いに違いがあるから,どうなんだろう,という感じ.なんとなく暗黙的共有ロックのことを言っているのではと思うけど.でも共有ロックは個人的にはあまり良い方法ではないと思う.

この暗黙的Select for Update(排他ロック)については実際には明日検証する予定.

先は長い.でもますます面白くなってきた感じ.