【问题标题】:Exclude certain DataSource(s) from HibernateJpaAutoConfiguration从 HibernateJpaAutoConfiguration 中排除某些数据源
【发布时间】:2020-07-25 00:08:53
【问题描述】:

我有一个包含 2 个数据源的项目。一个用于 PostgreSQL,另一个用于 ClickHouse。目前没问题。

我打算仅通过 JDBC 将 ClickHouse 与本机 SQL 一起使用。

但我想将基于 JPA 的存储库与 PostgreSQL 数据源一起使用。如果我添加 spring-boot-starter-data-jpa 依赖项,HibernateJpaAutoConfiguration 会为 ALL 注册的 DataSource beans 启动。 ClickHouse 不是一个事务性关系数据库,它的 JDBC 实现非常有限和基本,从不打算与 Hibernate 一起使用。 所以我的问题是:是否可以将 DataSourceAutoConfiguration 用于两个数据源,但以某种方式告诉 HibernateJpaAutoConfiguration 仅使用 PostgreSQL 数据源进行配置?

我仍然想使用自动配置好东西,例如带有连接池的 DataSource 配置,而在属性文件中几乎只有几行。我知道我可以完全排除 HibernateJpaAutoConfiguration 并自行配置所有内容(entityManager、transactionManager、...),但如果可能的话,我想避免这种情况。只是告诉它避免配置 ClickHouse 数据源似乎更优雅。


更新

我的一些假设是不正确的。阅读接受的答案。很有见地。

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-boot-jpa


    【解决方案1】:

    DataSourceAutoConfiguration 仅在您没有为数据源定义任何 bean 时才会启动。然后它将根据application.properties 中配置的设置仅创建和配置一个数据源。这意味着如果您需要创建两个数据源,它不能用于这种情况,您必须手动定义两个数据源。您可以参考docs,通过模拟DataSourceAutoConfiguration的操作来配置多个数据源。

    另一方面,HibernateJpaAutoConfiguration 只有在定义了一个 Datasource bean 时才会生效(请参阅codes,因为它标有 @ConditionalOnSingleCandidate

    并且来自@ConditionalOnSingleCandidatejavadoc

    @Conditional 仅在指定类的 bean 为 已经包含在 BeanFactory 中,并且单个候选者可以是 确定。

    如果有多个匹配的 bean 实例,条件也将匹配 已包含在 BeanFactory 中,但主要候选者已 定义;本质上,如果使用自动连接 bean,则条件匹配 定义的类型会成功。

    这意味着您可以简单地将您为 PostgreSQL 定义的 DataSource bean 标记为 @PrimaryHibernateJpaAutoConfiguration 应该只考虑它而忽略其他的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2012-11-07
      相关资源
      最近更新 更多