首页 > 解决方案 > 将 Spring Boot 配置为同时使用 H2 和 Oracle

问题描述

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

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

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

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

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

我曾尝试创建一个dataSource批处理,但遇到了圆形 bean 创建错误。

我尝试创建一个BatchConfigurer并且遇到圆形 bean 创建错误。

我已经尝试创建一个JobRepositoryFactoryBean,但仍然创建了一个默认值。

我试过@PersistenceContext在我的@Entity课上使用 a 。

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

谢谢,韦斯。

标签: springjpaspring-batch

解决方案


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

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

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

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

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

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

谢谢,韦斯。


推荐阅读