【问题标题】:Configuring Spring Boot to use both H2 AND Oracle at the same time将 Spring Boot 配置为同时使用 H2 和 Oracle
【发布时间】:2020-02-26 02:55:46
【问题描述】:

我正在编写一个 Spring Batch 作业,不关心重新启动,也不希望为 Spring Batch 数据库对象创建、保护和管理 Oracle 模式的麻烦。文件系统上的 H2 对我们来说已经绰绰有余了。

问题是我正在编写一个需要连接到 Oracle 数据库的批处理作业,并且仅仅试图获取 2 个数据源、事务管理器和实体管理器就惨遭失败。现在我正在尝试两个H2数据库,甚至还没有尝试配置Oracle数据库。

我过去曾在其他 Spring Boot 应用程序中成功使用过两个 Oracle 数据源,但这是我第一次尝试使用带有配置代码来创建数据源的 Spring Batch。

我尝试创建两个DataSourceEntityManagerFactoryBeanTransactionManager,其中一个使用默认spring.datasources 配置、默认bean 名称和@Primary

我尝试使用不同的 bean 名称创建第二个 DataSourceEntityManagerFactoryBeanTransactionManager。这似乎存在TransactionManager orEntityManager 已分配给线程的问题。

我尝试为批处理创建 dataSource,但遇到了循环 bean 创建错误。

我已尝试创建 BatchConfigurer,但遇到了循环 bean 创建错误。

我已尝试创建JobRepositoryFactoryBean,但仍会创建默认值。

我尝试在我的 @Entity 课程中使用 @PersistenceContext

它不应该这么难,所以我一定错过了一些东西。任何帮助将不胜感激。

谢谢,韦斯。

【问题讨论】:

  • 谢谢。这是一个不同的错误,但我通读了它。唯一新的是定义DefaultBatchConfigurer@Component。我试过了,但它并没有改变我的结果,因为我能够删除它并且仍然获得最终的“成功”。

标签: spring jpa spring-batch


【解决方案1】:

我认为我取得了一些成功。我最终能够使用 Spring Boot 2.2.0 和 Spring Batch 4.2.0 运行批处理作业,但在为 Spring Batch 存储库创建 H2 实体管理器时,我必须等待 5 分钟超时。尽管 H2 实体管理器是 @Primary,但 Oracle 实体管理器的注册速度非常快并且在 H2 实体管理器之前。

我的两个数据源中的每一个都有一个单独的配置类。每一个都用@Configuration@EnableTransactionManagement@EnableJPARepository注解。

Spring Batch 使用标准 bean 名称,dataSourceentityManagerFactorytransactionManager。每个@Bean 都带有@Primary 注释。 我需要的一项设置是将.packages("org") 添加到entityManagerFactory bean。这将获取所有org.springframework,包括 Spring Batch。 我对常见实现所做的唯一真正更改是在实体管理器的 JPA 属性中设置方言。

我需要spring.main.allow-bean-definition-overriding: true 设置。

我的解决方案可能还有更多我应该分享的,但我已经在这个问题上做了几天并且一直在兜圈子。我什至记得得到了一个看起来像挂起的过程时间,并认为它被挂起而杀死了工作。我可能在早期取得了一些“成功”,但太快了,无法终止执行。

我仍然想知道为什么创建 H2 实体管理器需要这么长时间。

谢谢,韦斯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 2019-01-26
    • 2016-05-15
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多