ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Springのトランザクションマネージメントの問題点

今、SpringとHibernateの仲は超悪くなっています。
http://www.logemann.org/blojsom/blog/default/2005/07/07/oops_JBoss_did_it_again_or_how_to_say_forget_Spring.html?page=comments
http://houseofhaug.net/blog/archives/2005/08/12/hibernate-hates-spring/
このことを技術的な観点から読み解くと、1つの問題点が浮かび上がります。それは、Springのトランザクションマネージメントの問題点です。
Springの根っことなるトランザクションマネージメントは、独自のものを使っていて、標準的なJTAを使っていません。JTAを使うときにはアダプターを使って利用することになります。
そのため、Hibernateトランザクション用アダプター、Jotm用だとかいろいろ用意する羽目になります。今見たら、WebLogic用だとか、WAS用もあってちょっとびびった。
J2EEではトランザクションAPIJTAが標準であり、ほとんどのフレームワークは、JTAと連動するような口を用意しています。それなら、根っことなるトランザクションAPIJTAを使うべきではないでしょうか。
Seasar2ではそのように考えているので、JTAが標準です。TomcatなどデフォルトだとJTAの機能を提供していない環境向けにJTAのLightweightな実装も提供しています。WASなどJ2EEのサーバを使うときには、もちろんそのサーバのJTAを利用することができます。JTAの実装も1つだけであり、Springのようにトランザクション用のアダブターをたくさん作る必要もありません。
これは、前から指摘していた問題点ですが、最近急に浮かび上がってきたのは、Hibernate3から独自のトランザクションAPIをやめ、JTA一本に絞ったからです。
これにより、Spring陣営は困りました。JTAの実装を提供する環境でないとSpringとHibernate3が組み合わせられなくなったからです。
Springの方は、いろいろ不満があったようですが、結局Hibernateは、標準的なAPIを使うべきだということで押し切ったようです。
進化の早い分野では、確かに標準化が足を引っ張ることがありますが、トランザクションのように成熟した分野ではできる限り標準に従うべきです。
今回の騒動は、この問題が顕著に出た例だと思います。