11

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

<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 实现它会非常尴尬。关于如何在需要时使用一个数据源并切换数据库有什么想法/想法吗?

4

2 回答 2

14

您可以通过扩展 SpringAbstractRoutingDataSource并将现有数据源包装在其中来做到这一点。查看这篇文章了解详情。引用文章:

一般的想法是路由数据源充当中介——而“真实”数据源可以在运行时根据查找键动态确定。

另请参阅关于 SO 的类似问题:

  1. 使用 AbstractRoutingDataSource 动态更改数据库架构/目录
  2. 从具有相同持久性单元的多个数据库中读取?
  3. 如何使用 JDBC 在 Spring 中创建动态连接(数据源)
于 2013-01-15T03:50:30.340 回答
0

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

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

于 2013-01-15T03:44:12.933 回答