プロが教える店舗&オフィスのセキュリティ対策術

Tomcat4 + Struts1.1にて、ログインした人の種別により接続するDataSourceの切り替えを行いたいのですが、このようなことは出来るのでしょうか?

--------------------------------------------
例:ユーザA、ユーザBで接続するDBを変更する。
--------------------------------------------
1.データベースに2つのDataSourceを用意する。
  ※以降DB1,DB2とする。
   中のテーブル設定は全く同じとする。

2.ユーザAがログインした場合はDB1のhogeTableを、
  ユーザBがログインした場合はDB2のhogeTableを
  参照してデータを取得する。
--------------------------------------------
要は、1つのシステムでユーザ毎にデータベースが分かれている為、ログイン情報によってどのデータベースを参照するかを切り替えたいのです。
(こうすればテーブル名は同じの為、データアクセス部分は共用できると考えています。)

Struts-configには複数のDataSourceが設定できますが、こちらをどうやって切り替えれば良いのかが分からずに困っています。
(また切り替え以外での対応方法はあるのでしょうか?)

こちらの件で、どなたかご存知の方、もしくは詳細な説明が記載されたHPを知っている方がおられましたら、教えていただけないでしょうか?
よろしくお願いいたします。

A 回答 (3件)

struts-config.xml のデータソース記述部分に



<data-source key="aaa">
~省略
</data-source>

<data-source key="bbb">
~省略
</data-source>

などとキーを設定して識別できるようにします。
実際にデータソースを必要とする部分で

context = req.getServletContext();
dataSource ds = (DataSource)context.getAttribute("aaa");

とすれば "aaa" のデータソースを取得できます。
getAttribute("bbb"); とすれば "bbb" のデータソースを取得できます。

>データアクセス部分は共用できると考えています
やったわけではないですが、可能と思います。
#1さん御心配の件はDBコネクション自体を引数で渡すように設計することにより、なんら問題はないと思います。例のソースのようにユーザ識別をあちこちにちりばめる必要はありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
上記のようにdata-sourceでキーの設定をすれば
大丈夫そうですね。

データアクセス部分の共用の件についは、
データソースの切り分け部分を別クラス
(もしくは共通で使用するクラス)に定義して、
呼び出すようにしてあげれば、きれいに
まとまるかなと思います。

一度上記の方法で試してみます。
どうもありがとうございました。

お礼日時:2005/05/19 08:50

#1です。


やっぱり的外れだったようで…。
申し訳ありませんでした。

自身の参考にもなりました。
ありがとうございました。
    • good
    • 0
この回答へのお礼

とんでもございません。
ご回答頂きまして大変感謝しております。
m(_ _)m

お礼日時:2005/05/20 08:41

的はずれな回答だったらごめんなさい。



JDBCレベルの場合ですと
DriverManager.getConnection(String url)
は(その他のgetConnectionメソッドも)
引数にurlを指定しますので、
>テーブル名は同じの為、データアクセス部分は共用できる
は成り立たないと思うのですが…

つまり、接続先が2つあるのであれば
Connection db1 = DriverManager.getConnection(db1URL);
Coonection db2 = DriverManager.getConnection(db2URL);
とConnectionを2つ保持しないといけないのでは…。

Statementのexecute(String sql)
に渡すSQL文は同じSQL文
String sql = "SELECT * FROM hogeTable";
でいいと思いますが、実行する部分は
Statement stdb1 = db1.createStatement();
Statement stdb2 = db2.createStatement();
if(ユーザー判別){
  //ユーザーA
  stdb1.execute(sql);
}else{
  //ユーザーB
  stdb2.execute(sql);
}
と判別しないといけないと思いますが…
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
JDBCレベルだと、確かにご回答いただいたかたちで
大丈夫ですね。

ただ今回はStrutsということもあり、
上記の方法での対応は出来ないかなと
考えています。

ただし(フレームワーク等を使用しない)純粋な
WEBシステムなら今回の方法がもっとも手軽かなと
おもいます。

どうもありがとうございました。

お礼日時:2005/05/19 08:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!