如何使用一个DataSource以编程方式在Spring中更改数据库?

时间:2013-01-15 03:23:38

标签: java spring jdbc datasource

我希望看到在Spring中使用一个DataSources的最佳方法是什么,但能够从Java代码中切换数据库?下面是我的两个DataSource,它们转到相同的数据库服务器但是不同的数据库。

<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来实现它是非常尴尬的。关于如何在需要时使用一个DataSource和切换数据库时是否有任何想法/想法?

2 个答案:

答案 0 :(得分:12)

您可以通过扩展Sp​​ring 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

答案 1 :(得分:0)

有很多方法可以做到这一点。例如,您可以创建服务类DatasourceSelectorService,并根据某些输入(例如:配置文件/用户输入),相应地选择datasource's bean。

所有其他需要datasource的类都应该通过此DatasourceSelectorService获取它。