[Seasar-user:9077] Re: IPアドレスを渡しての動的なDB変更

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 7月 10日 (火) 20:00:06 JST


小林 (koichik) です.

Date:    Tue, 10 Jul 2007 18:20:12 +0900
From:    大坪 淳一 <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:9076] Re: IPアドレスを渡しての動的なDB変更

> ただ、
> >   public void hoge() {
> >     xaDataSource.setURL("jdbc:mysql://" + addr1 + ":3306/test");
> >     dao.select();
> >     xaDataSource.setURL("jdbc:mysql://" + addr2 + ":3306/test");
> >     dao.select();
> >   }
> のようなことがしたいのですが、その場合はどうすれば良いでしょうか。

これらは同一トランザクションでのアクセスに
なるのでしょうか?
それとも独立したトランザクションですか?

同一のトランザクションで,しかも本当に XA で
2 フェーズコミットが必要なら先の XADataSourceImpl は
そもそも使えません.

独立したトランザクションの場合はそれぞれの
トランザクション境界を明確にして,そこに
トランザクションのアスペクトを適用すれば
よいかと.
例えば

public void foo() {
  bar(addr1);
  bar(addr2);
}
public void bar(String addr) {
  xaDataSource.setURL("jdbc:mysql://" + addr + ":3306/test");
  dao.select();
}

foo() にはトランザクションを設定せず,bar() の方に
設定すれば,それぞれ指定のアドレスの DB に接続します.

> もう一つ、親のPCのIPアドレスをデフォルトで設定しておきたいのですがなにか
> 良い方法はないでしょうか。

親と子を区別してアクセスするならデータソースの
設定も個別にした方がいいように思いますが.

もし一つのデータソースで親も子もアクセスするなら,
XADataSourceImpl に defaultURL のような
プロパティを追加してそこに親 PC の URL を
設定し,getURL() メソッドはurl という
スレッドローカルの値が null だったら
defaultURL の値を返すようにすればいいかと.

その場合,子の方にアクセスした後は必ず

    xaDataSource.setURL(null);

のようにしないといけなくなり,何かと
問題を抱えやすい気のせいがするので,
親と子は別のデータソースにするか,親であれ
子であれ常に URL を明示的に設定する方が
無難だと思います.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内