spring - 将 Spring Boot 配置为同时使用 H2 和 Oracle
问题描述
我正在编写一个 Spring Batch 作业,不关心重启,也不希望为 Spring Batch 数据库对象创建、保护和管理 Oracle 模式的麻烦。文件系统上的 H2 对我们来说绰绰有余。
问题是我正在编写一个需要连接到 Oracle 数据库的批处理作业,并且仅仅试图获取 2 个数据源、事务管理器和实体管理器就惨遭失败。现在我正在尝试两个 H2 数据库,甚至还没有尝试配置 Oracle 数据库。
我过去曾在其他 Spring Boot 应用程序中成功使用过两个 Oracle 数据源,但这是我第一次尝试使用 Spring Batch,它具有创建数据源的配置代码。
我尝试创建两个DataSource
,EntityManagerFactoryBean
其中TransactionManager
一个使用默认spring.datasources
配置、默认 bean 名称和@Primary
.
我试过只创建第二个DataSource
,EntityManagerFactoryBean
并TransactionManager
使用不同的 bean 名称。这似乎存在TransactionManager or
EntityManager 已分配给线程的问题。
我曾尝试创建一个dataSource
批处理,但遇到了圆形 bean 创建错误。
我尝试创建一个BatchConfigurer
并且遇到圆形 bean 创建错误。
我已经尝试创建一个JobRepositoryFactoryBean
,但仍然创建了一个默认值。
我试过@PersistenceContext
在我的@Entity
课上使用 a 。
它不应该这么难,所以我一定错过了一些东西。任何帮助,将不胜感激。
谢谢,韦斯。
解决方案
我想我已经取得了一些成功。我最终能够使用 Spring Boot 2.2.0 和 Spring Batch 4.2.0 运行批处理作业,但是在为 Spring Batch 存储库创建 H2 实体管理器时,我必须等待 5 分钟超时。尽管 H2 实体管理器是 .Oracle 实体管理器,但它的注册速度非常快,并且在 H2 实体管理器之前@Primary
。
我的两个数据源中的每一个都有一个单独的配置类。每一个都用和@Configuration
注释。@EnableTransactionManagement
@EnableJPARepository
Spring Batch 的一个是使用标准 bean 名称dataSource
,entityManagerFactory
和transactionManager
。每个@Bean
都用 注释@Primary
。我需要的一个设置是向 bean 添加.packages("org")
一个entityManagerFactory
。这将org.springframework
包括 Spring Batch 在内的所有内容。我对常见实现所做的唯一其他真正更改是在实体管理器的 JPA 属性中设置方言。
我需要spring.main.allow-bean-definition-overriding: true
设置。
我的解决方案可能还有更多我应该分享的内容,但我已经在这个问题上待了几天并且一直在兜圈子。我什至记得得到了一个看起来像挂起的过程时间,并认为它被挂起而杀死了工作。我可能在早期取得了一些“成功”,但太快了,无法杀死执行。
我仍然想知道为什么创建 H2 实体管理器需要这么长时间。
谢谢,韦斯。
推荐阅读
- java - 如何切换到另一个活动以及更改该活动中的片段?
- swift - 如何在具有平移手势的视图上添加滑动手势?
- flatten - 如何使用 Jolt 用键展平包含 n 个对象的 json 数组?
- prestashop - 需要有关 prestashop 1.7.x 的最小模块的帮助
- python-3.x - 无法从“colorama”导入名称“init”
- android - Android WebView when refresh it always goes to home page
- python - Tensorflow:如何训练神经网络?
- ruby-on-rails - 我的 CREATE & DELETE 路线不起作用不明白为什么?
- javascript - 如何在 Google 跟踪代码管理器中将数据层变量从数字转换为字符串
- python - Python-USDA 客户端抛出包错误。什么是正确的包名?