1

我有一个带有 2 个数据源的项目。一个用于 PostgreSQL,另一个用于 ClickHouse。到目前为止没有问题。

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

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

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


更新

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

4

1 回答 1

3

DataSourceAutoConfiguration仅当您没有为数据源定义任何 bean 时才会启动。然后它将根据application.properties. 这意味着如果您需要创建两个数据源,它不能用于这种情况,您必须手动定义两个数据源。您可以参考文档,了解如何通过模拟DataSourceAutoConfiguration.

另一方面,HibernateJpaAutoConfiguration只有在Datasource定义了一个 bean 时才会生效(请参阅标有​​的代码@ConditionalOnSingleCandidate

并且来自以下的javadoc@ConditionalOnSingleCandidate

@Conditional 仅在指定类的 bean 已包含在 BeanFactory 中并且可以确定单个候选者时匹配。

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

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

于 2020-04-12T13:41:31.107 回答