【问题标题】:How to switch the datasource dynamically at runtime using AbstractRoutingDataSource?如何使用 AbstractRoutingDataSource 在运行时动态切换数据源?
【发布时间】:2014-01-17 08:03:57
【问题描述】:

要求:

我有一个需求,想在收到请求后在运行时切换数据源。

我已经阅读了关于在 spring3 中使用类 AbstractRoutingDataSource 在运行时路由数据源的博客。使用它我们可以在运行时获取手动定义的数据源键。

在我的项目中,数据源已在 jetty-env.xml 文件中配置。现在,我想从 app_config 等一些表中的数据库中检索数据库名称。使用该数据库名称,我想在运行时切换数据库,并且我想将参数传递给 jetty-env.xml 文件。

【问题讨论】:

    标签: spring hibernate datasource


    【解决方案1】:

    即使我在尝试从 DB 设置数据源时也遇到了问题。您可能喜欢我的解决方案(使用注释而不是 xml)。 Spring 3.1.3 + Hibernate Configuration with annotations and with (Dynamic) AbstractRoutingDataSource

    查看“EDIT”,您可以在其中设置任意数量的静态数据源)或在 xml 中使用它们。

    【讨论】:

      【解决方案2】:

      创建 DriverManagerDataSource 的新子类,并将其自动连接到 DAO 以访问表 app_config。

      然后例如覆盖 getUrl() 方法,并使用代码 dbNameParameter 构造 url,该代码允许从应用配置中检索数据库名称:

      <bean id="parentDataSource"
               class="org.springframework.jdbc.datasource.custom.MyDriverManagerDataSource"
               abstract="true">
         <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
         <property name="username" value="sa"/>
      </bean>
      
      <bean id="goldDataSource" parent="parentDataSource">
         <property name="dbNameParameter" value="gold"/>
      </bean>
      

      jetty-env.xml 不适用于该用途,最好不要用于此用例。最好只在 jetty-env.xml 中放入表 app_config 所在的数据源。

      【讨论】:

        【解决方案3】:

        您应该将租户标识符存储在 ThreadLocal 中,提供数据源列表,配置 AbstractRoutingDataSource 以在运行时根据租户标识符选择数据源。

        【讨论】:

          猜你喜欢
          • 2014-11-28
          • 2019-10-25
          • 2016-12-19
          • 1970-01-01
          • 2018-05-26
          • 2010-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多