« SingletonS2Containerでキャストなしのコンポーネント取得 | Main | Seasarの環境の切替 »

2009.02.17

TeedaでマルチマスタDBの更新を行う

 複数台のサーバでPostgreSQLを稼働させている場合、pgpoolなどを用いることでマルチマスタDBの環境を構築することができますが、pgpoolなどを使用せずにSeasar2 + TeedaでマルチマスタDBを更新する方法のメモ。ただし、実際にこのような方式でいいのかどうか、および記述している内容が本当に正しいのかどうかは不明です(^^; (もっと楽な方法があるのかもしれません)

  • Seasar2 + Teedaの環境の場合、基本的にdoXxxやinitialize/prerenderはJTAを利用したトランザクションになっているので、(JDBCドライバが対応していれば)特に意識することなくTwo Phase Commitで処理されるため、DBの内容の一貫性は保てる(もちろん、2PCも万能ではないため、100%という保証はできませんが・・・)。
  • s2container.findAllComponents(ConnectionPool.class) で、コンテナに登録されているConnectionPoolオブジェクトを全て取得することができる。戻り値はConnectionPoolの配列になるので、ループで処理することが可能(戻り値がObject[]なのでキャストは必要となりますが)。
  • コネクションプールからのコネクションの取得は、ConnectionPool#checkOut()で行う。戻り値はConnectionWrapperで、StatementやPreparedStatementは、このWrapperから取得する(getPhysicalConnection()などでさらに内側のコネクションを取得する必要はなし)。
  • デフォルトの状態だとdoXxxの終了時に自動的にcommit(例外が発生した場合はrollback)が行われるので、明示的にcommit等をしなくても可。
  • コネクションの解放はConnectionWrapper#close()で行う。内部的に、ConnectionPool#checkIn(ConnectionWrapper)などが実行される。

 データの更新処理を行うところ全てでコネクションの取得処理を行うとなると面倒なので、現実的にはHelperクラスかLogicクラスなどで処理を行うことにするといい感じかも?

 なお、S2Dao等でカバーできる範囲であれば、こんな面倒なことをしなくてもOKのはずです。S2Daoの場合、1つの接続先に対して1つのインタフェースを定義しなければいけない(と思う)ので、接続先が増えてきた場合に管理が面倒になってきそうな感じなので、S2Daoを使わずに済む方法の模索、ということで(もちろん、接続先が増えた場合、最低限jdbc.diconの追加は必要となりますが)。

 ちなみに、複数のスキーマを使い分けるような場合においても、直接Connectionを取得した方が楽なケースも出てくるのではないかと(search_pathの指定である程度はカバーできますが)。

|

« SingletonS2Containerでキャストなしのコンポーネント取得 | Main | Seasarの環境の切替 »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/44055991

Listed below are links to weblogs that reference TeedaでマルチマスタDBの更新を行う:

« SingletonS2Containerでキャストなしのコンポーネント取得 | Main | Seasarの環境の切替 »