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

大坪 淳一 [E-MAIL ADDRESS DELETED]
2007年 7月 10日 (火) 18:20:12 JST


小林 (koichik) さん

大坪です。返信ありがとうございます。

教えていただいた方法で動作することを確認しました。
ただ、
>   public void hoge() {
>     xaDataSource.setURL("jdbc:mysql://" + addr1 + ":3306/test");
>     dao.select();
>     xaDataSource.setURL("jdbc:mysql://" + addr2 + ":3306/test");
>     dao.select();
>   }
のようなことがしたいのですが、その場合はどうすれば良いでしょうか。
addr1のDBにアクセスした後にaddr2、addr3・・・と続けてアクセスしたい場合
があります。

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

申し訳ありません、開発環境をお伝えするのを忘れていました。
Dolteng0.18.1で生成したChura Project(Super Agile)を使用しております。
Teeda:1.0.6
S2Dao:1.0.40
S2:2.4.12
いつでもバージョンアップはできます。

以上です、よろしくお願いします。

> 小林 (koichik) です.
> 
> Date:    Tue, 10 Jul 2007 15:34:44 +0900
> From:    大坪 淳一 <[E-MAIL ADDRESS DELETED]>
> To:       [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:9067] IPアドレスを渡しての動的なDB変更
> 
> > getComponentでDaoを取得する時かSQL文を発行する時などに、
> > IPアドレスを引数などで渡して動的にDBを指定してSQL文を
> > 発行したいのですが可能でしょうか?
> > 1台の親PCのDBのテーブルからIPアドレスを取得して、その
> > IPアドレスのPC(子のPC)のDBに対してSQLを発行したいのですが…。
> 
> 全然テストしていませんが,添付の XADataSourceImpl を
> 使って試してみてください.
> 設定の仕方は以下の通りです.
> 
> jdbc.dicon (S2.3 なら j2ee.dicon) にある MySQL 用の
> XADataSourceImpl の定義があるので,
> パッケージを org.seasar.extension.dbcp.imp から
> sample (これは適当に変更してください) に変更します.
> URL の指定は削除してください.
> 
> <component name="xaDataSource"
>     class="sample.XADataSourceImpl"><!-- ここ -->
>   <property name="driverClassName">"com.mysql.jdbc.Driver"</property>
>   <property name="user">"xxx"</property>
>   <property name="password">"xxx"</property>
> </component>
> 
> ConnectionPoolImpl の定義があるので,
> maxPoolSize プロパティの値を 0 にしてください.
> 
> <component name="connectionPool"
>     class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
>   <property name="timeout">600</property>
>   <property name="maxPoolSize">0</property><!-- ここ -->
>   <property name="allowLocalTx">true</property>
>   <destroyMethod name="close"/>
> </component>
> 
> 
> プログラムでは,Dao にアクセスする前に
> XADataSourceImpl の URL プロパティに
> 適切な値を設定してください.
> 
> public class Foo {
>   private XADataSourceImpl xaDataSource;
>   public void setXADataSource(XADataSourceImpl) {
>     this.xaDataSource = xaDataSource;
>   }
> 
>   public void hoge() {
>     xaDataSource.setURL("jdbc:mysql://" + addr + ":3306/test");
>     dao.select();
>   }
> }
> 
> こんな感じでできるんじゃないかと思います.
> 
> やっていることは,sample.XADataSourceImpl は
> URL をスレッドローカルで持つようにして,
> コネクションが必要になった場合は そのスレッドで
> 直前に setURL() された URL に接続するというものです.
> 
> ただし,コネクションがプールされてしまうと
> ぐちゃぐちゃになってしまうので maxPoolSize を
> 0 にしてプールしないようにしています.
> 
> なお,トランザクション内では同じコネクションが
> 使われるので,setURL() しても効果はありません.
> 
>   public void hoge() {
>     xaDataSource.setURL("jdbc:mysql://" + addr1 + ":3306/test");
>     dao.select();
>     xaDataSource.setURL("jdbc:mysql://" + addr2 + ":3306/test");
>     dao.select();
>   }
> 
> hoge() がトランザクション内で呼び出されると,
> 2 回目の Dao の呼び出しは最初の呼び出しと同じ
> コネクション (addr1) が使われます.
> 
> 
> ともあれ (JW),全然テストしていないので
> 何か問題があればまた質問してください.
> あるいは要件が満たせないならまた相談してください.
> その際は,お使いの S2 のバージョンや,もし
> S2Dao を使っているならそのことも記述していただけると
> 助かります.
> 
> 
> 
> --
> <signature>
>    <name>Koichi Kobayashi</name>
>    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
> </signature>



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