2013-01-15 26 views
9

私は、Springで1つのDataSourceを使用するのにJavaコード内からデータベースを切り替えることができる最良の方法は何か探していますか?私の2つのデータソースは以下のとおりで、同じデータベースサーバーだが異なるデータベースに移動します。1つのDataSourceでSpringのデータベースをプログラム的に変更するにはどうすればよいですか?

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
    <property name="driverClassName" value="com.sybase.jdbc3.jdbc.SybDataSource" /> 
    <property name="url" 
       value="jdbc:sybase:Tds:10.20.30.40:50/DATABASE_EMS" /> 
    <property name="username" value="userid" /> 
    <property name="password" value="derp" /> 
</bean> 

<bean id="dataSourceMain" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
    <property name="driverClassName" value="com.sybase.jdbc3.jdbc.SybDataSource" /> 
    <property name="url" 
       value="jdbc:sybase:Tds:10.20.30.40:50/DATABASE" /> 
    <property name="username" value="userid" /> 
    <property name="password" value="derp" /> 
</bean> 

私は彼らが自分のそれぞれのBeanに結合したが、私は自分のレガシーコードを見ていることだし、それは2つの別々の豆でこれを実装することは非常に厄介なことになるだろうがあります。必要なときに1つのDataSourceを使用してデータベースを切り替える方法についてのアイディアや考えはありますか?

+0

どのようにデータベースを切り替えたいのですか?データベースを決定する基準は何ですか? –

+0

良いことは、動的である必要はないということです。必要に応じて、DAOを呼び出す前に明示的に変更することができます。 – Carlos

答えて

11

これを行うには、SpringのAbstractRoutingDataSourceを拡張し、既存のデータソースをその中にラップします。詳細はthis articleをご確認ください。記事から引用: - 「実際の」データソースが検索キーに基づいて実行時 で動的に決定することができながら、

一般的な考え方は、ルーティングDataSourceが仲介 として作用することです。

はまたSO上で同様の質問を参照してください。

  1. Using AbstractRoutingDataSource to dynamically change the database schema/catalog
  2. Reading from multiple Db's with same Persistence Unit?
  3. How to create Dynamic connections (datasource) in spring using JDBC
+0

これまでのところ、最も完全な答えです。私は受け入れられたものとしてマークし、これらのSpring機能を検証するためにいくつかのPOCを実行します。ありがとう! – Carlos

0

これを行う方法はたくさんあります。たとえば、サービスクラスDatasourceSelectorServiceを作成し、入力(たとえば、設定ファイル/ユーザ入力)に基づいて、それに応じてdatasource'sのBeanを選択します。

datasourceを必要とする他のすべてのクラスは、このDatasourceSelectorServiceを使用して取得する必要があります。

関連する問題