【问题标题】:Spring-batch metadata tables in different schema不同模式中的 Spring-batch 元数据表
【发布时间】:2015-09-08 18:48:02
【问题描述】:

我的应用程序中有一个连接到 Oracle 数据库的数据源。是否可以通过此数据源访问包含 Spring-batch 元数据表的另一个模式?此数据源的用户拥有访问其他架构的所有权限。

我已经尝试过 JobRepository 的“tablePrefix”属性,例如“Schema.batch_”。但它不起作用。简而言之,我寻找告诉 Spring-batch 访问元数据表的方法,例如“select ....from Schema.batch_..”而不是“select ...from batch_...”。

【问题讨论】:

  • 您遇到了什么错误?
  • 事实上,我没有收到错误消息。但是我看到 Spring Batch 尝试使用没有任何模式前缀的表名进行查询,即使我将 tablePrefix 属性定义为“schema.batch_”。

标签: spring spring-batch


【解决方案1】:

我遇到了同样的问题,因为我想将应用程序表保存在一个架构中,而将批处理表保存在一个单独的架构中(使用 postgres)。

tablePrefix 对我也不起作用(我尝试了不同的情况 - 都没有解决问题)。

所以最后我决定为 Spring Batch 配置一个单独的 DataSource,指向 batch 模式。这是我的做法。

application.properties 文件中,我有像 spring.datasource.* 这样的标准道具,用于应用程序作为主要数据源。

spring.batch.datasource.* 这样的道具是非标准的,并且是仅在下面提供的代码中使用的辅助数据源。

这是 application.properties 文件的示例:

spring.datasource.url=APP_DB_CONNECTION_URL
spring.datasource.username=APP_DB_USER
spring.datasource.password=APP_DB_PASS

spring.batch.datasource.url=BATCH_DB_CONNECTION_URL
spring.batch.datasource.username=BATCH_DB_USER
spring.batch.datasource.password=BATCH_DB_PASS

然后在 BatchConfiguration.java 这是应用程序源的一部分,我添加了getBatchDataSource 方法,该方法读取spring.batch.datasource.* 属性:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

  @Bean
  @ConfigurationProperties(prefix="spring.batch.datasource")
  public DataSource getBatchDataSource(){
    return DataSourceBuilder.create().build();
  }

  ...

}

这使得 Spring Batch 使用单独的数据源。

现在重要的是正确设置spring.batch.datasource.*

对于 Postgres 9.4,您可以使用 currentSchema 参数在连接 URL 中指定架构:jdbc:postgresql://host:port/db?currentSchema=batch

对于 9.4 之前的 Postgres,您可以使用 searchpath 参数在连接 URL 中指定架构:jdbc:postgresql://host:port/db?searchpath=batch

或者您可以为 batch 架构创建单独的 postgres 用户/角色并为该用户设置 search_pathALTER USER BATCH_DB_USER SET search_path to 'batch';

在 Oracle 中,每个用户都有自己的架构(据我所知),并且无法像 postgres 那样在连接 URL 中设置架构(我可能错了):jdbc:oracle:thin:@//host:port/sid

因此您需要在 Oracle 中为 batch 架构创建一个单独的用户。另一种方法是使用spring.batch.datasource.validation-query=ALTER SESSION SET CURRENT_SCHEMA=batch(这个我没试过)

因此,Spring Batch 以这种方式使用配置为使用专用 batch 架构的单独数据源。批量查询仍然看起来像select ...from batch_...,但它运行在batch 架构上。并且应用程序正在使用指向应用程序专用架构app 的常规数据源。

此解决方案已使用 Spring Boot v1.2.5.RELEASE 和 Postgres 9.4.1 进行了测试

希望这会有所帮助。

【讨论】:

  • 谢谢你。我已经用你描述的方式解决了这个问题。我使用了单独的数据源。但是,如果我不必定义另一个数据源并使用相同的数据源并授予另一个模式,那就更好了。
  • 除了两个数据源之外,上述问题的任何解决方案?我有同样的要求,我想在不同的模式中拥有元数据表,而且我实际上不希望 spring 批处理创建表,而是我必须预先创建它。我使用最新的 sprint boot(2.x) 。
  • 我找到了解决方案better-coding.com/…
  • @user3444718 - 我也需要围绕您的要求的解决方案。你能解决这个问题吗?
  • 设置 spring.batch.tableprefix=.batch_ 应该可以解决问题
【解决方案2】:

因为spring.batch.table-prefix=<yourschema>.batch_对我不起作用,我无法立即配置第二个数据源,所以我看了一下Spring Batch的实际表生成。

生成表的sql-Script 是静态的(至少在 4.2.2 版和 Postgresql 中)。 因此,spring.batch.table-prefix 不起作用也就不足为奇了。至少在我的情况下,因为数据库中尚不存在这些表。

为了修复它,我将 schema-postgresql.sql 复制到我的资源文件夹并根据我的需要对其进行了修改(创建架构并明确引用它)。

CREATE SCHEMA SPRING_BATCH;

CREATE TABLE SPRING_BATCH.BATCH_JOB_INSTANCE  (
    JOB_INSTANCE_ID BIGINT  NOT NULL PRIMARY KEY ,
    -- and so on 

在我的application.properties 中我添加了:

spring.batch.initialize-schema=always
spring.batch.table-prefix=SPRING_BATCH.BATCH_
spring.batch.schema=classpath:db/create_spring_batch_tables.sql

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 2015-02-15
    • 2020-11-26
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多