gpt4 book ai didi

spring - 在多个数据库上并行运行 Spring 批处理

转载 作者:行者123 更新时间:2023-12-02 20:56:12 25 4
gpt4 key购买 nike

我使用 Spring boot 创建了一个 Spring 批处理应用程序,并且有一个包含 9 个步骤的 Job。这些步骤使用 DataSource,我在配置文件中创建了它的 bean,如下所示:

@Configuration
public class DatabaseConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
@Primary
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
}

DataSource正在使用application.yml文件中声明的属性:

spring:
datasource:
url: jdbc:mysql://localhost:3306/db_01?zeroDateTimeBehavior=convertToNull
username: xxxx
password: ****

到目前为止,一切都按预期进行。

我想要做的是,我在第 5 个数据库 (db_settings) 中参数化了 4 个数据库,我使用 SQL 查询选择它。此查询将返回 4 个数据库及其用户名和密码,如下所示:

+--------+-----------------------------------+-----------------+-----------------+
| id | url | username_db | password_db |
+--------+-----------------------------------+-----------------+-----------------+
| 243 | jdbc:mysql://localhost:3306/db_01 | xxxx | **** |
| 244 | jdbc:mysql://localhost:3306/db_02 | xxxx | **** |
| 245 | jdbc:mysql://localhost:3306/db_03 | xxxx | **** |
| 247 | jdbc:mysql://localhost:3306/db_04 | xxxx | **** |
+--------+-----------------------------------+-----------------+-----------------+

因此,我不想使用“application.yml”中声明的数据库运行这些步骤,而是想在所有 4 个数据库上运行它们。并且考虑到处理量,有必要能够在这些数据库上并行启动批处理。

有人知道如何实现吗?

最佳答案

赏金在哪里? :-)

<小时/>

感谢 KeatsPeeks,AbstractRoutingDataSource 是该解决方案的一个很好的入门,这里有一个 good tutorial关于这一部分。

主要重要的部分是:

  1. 定义查找代码


公共(public)类 MyRoutingDataSource 扩展 AbstractRoutingDataSource {
@覆盖
protected 对象确定当前查找 key (){
字符串语言 = LocaleContextHolder.getLocale().getLanguage();
System.out.println("获取的语言:"+语言);
返回语言;
}
}

  • 注册多个数据源

    <bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

    <bean id="concreteDataSourceOne"
    parent="abstractDataSource"
    p:url="${jdbc.databaseurlOne}"/>

    <bean id="concreteDataSourceTwo"
    parent="abstractDataSource"
    p:url="${jdbc.databaseurlTwo}"/>
  • 那么之后,问题就变成了:

    1. 如何在spring启动时加载数据源配置属性,并使用数据库中的配置属性配置相应的dataSource

    2. 如何在 Spring Batch 中使用多个dataSource

      实际上,当我尝试谷歌它时,似乎这是最常见的情况,谷歌给出了建议搜索词 - “Spring Batch Multiple Data Sources”,有很多文章,所以我选择了答案

    3. 如何定义基于 Spring Batch 作业的查找代码(步骤)

      通常这应该是一个业务点,您需要定义查找策略,并且可以将其注入(inject)到com.example.demo.datasource.CustomRoutingDataSource#defineCurrentLookupKey以路由到专用数据源。

    限制

    真正有趣的是它实际上支持多个dataSource,但是数据库设置确实不能存储在数据库中。原因是它会出现循环依赖问题:

    The dependencies of some of the beans in the application context form a cycle:

    batchConfiguration (field private org.springframework.batch.core.configuration.annotation.JobBuilderFactory com.example.demo.batch.BatchConfiguration.jobs)

    org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration (field private java.util.Collection org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration.dataSources)
    ┌─────┐
    | routingDataSource defined in class path resource [com/example/demo/datasource/DataSourceConfiguration.class]
    ↑ ↓
    | targetDataSources defined in class path resource [com/example/demo/datasource/DataSourceConfiguration.class]
    ↑ ↓
    | myBatchConfigurer (field private java.util.Collection org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration.dataSources)
    └─────┘

    很明显,解决方案是打破 dataSourceroutingDataSource 之间的依赖关系

    • 在属性中保存数据库设置
    • 或者涉及其他方法,但不在主要dataSource

    另请参阅

    https://scattercode.co.uk/2013/11/18/spring-data-multiple-databases/ https://numberformat.wordpress.com/2013/12/27/hello-world-with-spring-batch-3-0-x-with-pure-annotations/

    http://spring.io/guides/gs/batch-processing/

    How to java-configure separate datasources for spring batch data and business data? Should I even do it?

    Github获取代码。

    关于spring - 在多个数据库上并行运行 Spring 批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434726/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com