2009-07-02 5 views
0

私の質問は、この1つに非常に関連しています:Multiple dynamic data sources for a servlet context。しかし、私はまだ適切な解決策を見つけておらず、もう一度質問したいと思います。複数のデータベースに動的にアクセスしますか?

JDBC経由でMS SQL Serverと通信する小さなJSFアプリケーションがあります。 TomcatはWebコンテナとして使用されます。アプリケーションは、そのデータを単一のデータベースから検索して保存します。ログイン画面が表示されます。資格情報がデータベースに格納されている資格情報と一致すると、アクセスが許可され、アプリケーションで再生できます。

ここでデータベースを追加し、ユーザー名とパスワードだけでなくデータベース名も要求するログイン画面を提供したいと思います。テストと開発のためにいくつかのデータベースを用意したいので、さまざまなデータベースが使用されています。バックアップ計画もすべてのデータベースで同じではありません。

現在、私は自分のコードでデータベースを検索するためにJNDI Resourcesを使用しています。しかし、これで私はcontext.xmlとweb.xmlを編集してTomcatを再起動する必要があります。私はそれをしたくありません。再起動すると私は誰にでも周りを回るように強制されます:「やあ、私はあなたの接続をすべて失うことに気をつけていますか?」

もう少し動的なやり方はありますか?

答えて

0

実際には、3つの別々のアプリケーションサーバーインスタンス(別々の3台のマシンまたは異なるポートを受信して​​いる同じマシンまたは異なるホストヘッダーなど)が必要です。開発サーバーインスタンスは常に開発データベースを検索し、ステージングサーバーはステージングデータベースなどを検索し、これを反映するようにJNDIを設定する必要があります。それがJNDIの目的です。

の場合、アプリケーションサーバーを1つだけ設定する必要がある場合は、これを行うカスタムauthentication realmを書き込む必要があります。実際にどのデータソースを自分で使うかを決定するか、Hibernate Shardsのようなものを調べるかのどちらかができます。

+0

あなたが正しいと思います – raupach

0

データソースの配列を作成し、この配列内のどのインデックスを使用するかをユーザーに選択させます。

+0

これはどのように動的ですか? DBAが新しいDBを作成する場合、インデックスはwebappにありません。 – raupach

0

答えはわかりませんが、OSQL -LをJNIから呼び出すと、その領域にある使用可能なSQLデータベースインスタンスのリストを取得できます。次に、接続してデータベース内のリストを取得することができます。

だから:

  1. ユーザーは、ユーザー名とパスワードを入力
  2. アプリは、JDBCは、ステップ1で資格情報を使用して、インスタンスのリストを取得するにはOSQL -L実行され、
  3. ユーザーがインスタンスを選択し、選択リストを提供しますインスタンスからデータベースのリストを取得する
  4. jdbcは、選択したデータベースを使用して接続します。
0

selectステートメントを使用してSQLサーバー内のデータベースを取得し、最終的にアプリケーションに関係のないデータベースの一部を破棄することができます。

ResultSet rs = stmt.executeQuery("show databases"); 
関連する問題