web-dev-qa-db-ja.com

1つのデータソースでSpringのデータベースをプログラムで変更するにはどうすればよいですか?

Springで1つのデータソースを使用するための最良の方法を探していますが、Javaコード内からデータベースを切り替えることができますか?以下は私の2つのデータソースであり、同じデータベースに移動しますサーバーですが、データベースが異なります。

<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つの別々のBeanでこれを実装するのは非常に厄介です。必要なときに1つのデータソースを使用してデータベースを切り替える方法についてのアイデア/考えはありますか?

11
Carlos

これを行うには、SpringのAbstractRoutingDataSourceを拡張し、既存のデータソースをラップします。詳細は この記事 を確認してください。記事からの引用:

一般的な考え方は、ルーティングデータソースが仲介者として機能することです。一方、「実際の」データソースは、ルックアップキーに基づいて実行時に動的に決定できます。

SOに関する同様の質問も参照してください。

  1. AbstractRoutingDataSourceを使用してデータベーススキーマ/カタログを動的に変更する
  2. 同じ永続性ユニットを持つ複数のDbから読み取る?
  3. JDBCを使用してSpringで動的接続(データソース)を作成する方法
14
Abhinav Sarkar

これを行うには多くの方法があります。たとえば、サービスクラスDatasourceSelectorServiceを作成し、いくつかの入力(例:構成ファイル/ユーザー入力)に基づいて、それに応じてdatasource'sBeanを選択できます。

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

0
gerrytan