动态数据源作为Spring Boot + Hibernate中的第二个数据源

时间:2017-02-07 10:33:35

标签: java jdbc spring-boot datasource

我有一个关于如何在Spring Boot应用程序中处理两个不同数据源的问题。

使用案例

  

我有一个主存储库(db)必须始终连接   (应用范围),我没有问题,有   TransactionManager和EntityManager。

     

第二个数据库连接应该只是请求作用域   从httpRequest收集的动态凭据。

数据源都来自PostgreSQL。

这甚至可能吗?如果是,那么实现这一目标的最佳方式是什么。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是两个数据源模式的有趣转折!

您的第二个数据源必须根据应用程序外部的信息进行解析,因此您将无法使用Spring应用程序上下文。

您可以在Spring中以编程方式配置数据源,本Q& A中涵盖了这一点:

Configure DataSource programmatically in Spring Boot

您的情况稍有不同,因为凭据将在运行时解析,但可以使用相同的想法。

  1. 确保您拥有Spring JDBC依赖项。
  2.     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    
    1. 使用DataSourceBuilder,使用您的凭据构建新的DataSource对象
    2. public DataSource getDataSource(String user, String password) {
          DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
          dataSourceBuilder.url(DBB_URL);
          dataSourceBuilder.username(user);
          dataSourceBuilder.password(password);
          return dataSourceBuilder.build();   
      }
      

      然后将其用作代码的数据源。您将无法对其进行自动装配,因此您将提出一种合理的策略,以便何时在JDBC方法中构建数据源,并将其与Spring JdbcTemplate一起使用,从而实现您正在寻找的事务完整性对于。

      您还没有指定其他注意事项。此策略假定您对两个数据源使用相同的JDBC驱动程序。如果使用的是不同的数据库,则必须为这些库添加依赖项,然后为动态数据源指定驱动程序类。