当前位置: 首页 > 知识库问答 >
问题:

Spring Batch-连接到Postgres数据库的问题

申屠瀚海
2023-03-14

到目前为止,我一直在Spring Batch中使用内存中的H2 DB。然而,现在我切换到连接外部postgres DB。这是我的连接对象(有些模糊):

@Bean
public DataSource postgresDatasource() {
    DriverManagerDataSource datasource = new DriverManagerDataSource();
    datasource.setDriverClassName("org.postgresql.Driver");
    datasource.setUrl("jdbc:postgresql://x.x.x.x:xxxx/blah");
    datasource.setUsername("Joe");
    datasource.setPassword("password");
    return datasource;
}

当我开始申请时,我得到:

原因:org。springframework。jdbc。BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[从批处理作业实例中选择作业实例ID、作业名称,其中作业名称=?和作业密钥=?];嵌套的异常是org。postgresql。util。PSQLException:错误:关系“批处理作业实例”不存在

然后我读到Spring Batch使用数据库保存元数据以实现其恢复/重试功能,对于嵌入式数据库,这些是Spring Batch默认设置的表。这就解释了为什么我以前从未见过这个错误。

但是,它说我可以设置这个属性:

spring.batch.initialize-schema=never

所以我把这个放在我的application.properties文件中。然而,我仍然得到错误。我将感谢任何想法。

共有1个答案

葛勇锐
2023-03-14

我自己也能解决这个问题。最终,我需要独立于实际目标关系数据库的Spring批处理存储库。所以我找到了这个参考:

https://github.com/spring-projects/spring-batch/blob/342d27bc1ed83312bdcd9c0cb30510f4c469e47d/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/DefaultBatchConfigurer.java#L84

我能够从该示例中获取DefaultBatchConfigurer类,并通过添加@Qualifier for embedded/local data source对数据源进行了一个小的更改:

@Autowired(required = false)
public void setDataSource(@Qualifier("dataSource") DataSource dataSource) {
    this.dataSource = dataSource;
    this.transactionManager = new DataSourceTransactionManager(dataSource);
}

然后,在我的Spring批处理阅读器(在我的另一个批处理配置类中)上,我对数据源做了一个小改动,添加了@Qualifier for postgres数据源:

@Bean
public ItemReader<StuffDto> itemReader(@Qualifier("postgresDataSource")DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<StuffDto>()
    .name("cursorItemReader")
    .dataSource(dataSource)
    .sql(GET_DATA)
    .rowMapper(new BeanPropertyRowMapper<>(StuffDto.class))
    .build();
}

然后最后(或者首先真的像我首先做的那样),我明确地命名了我的数据源bean,以便java可以区分它们以如上所述使用:

@Configuration
public class PersistenceContext {


    @Bean(name = "dataSource")
    public DataSource dataSource() {
        DriverManagerDataSource datasource = new DriverManagerDataSource();
        datasource.setDriverClassName("org.h2.Driver");
        datasource.setUrl("jdbc:h2:file:/tmp/test");
        datasource.setUsername("sa");
        datasource.setPassword("");
        return datasource;
    }

    @Bean(name = "postgresDataSource")
    public DataSource postgresDatasource() {
        DriverManagerDataSource datasource = new DriverManagerDataSource();
        datasource.setDriverClassName("org.postgresql.Driver");
        datasource.setUrl("jdbc:postgresql://x.x.x.x:xxxx/blah");
        datasource.setUsername("joe");
        datasource.setPassword("password");
        return datasource;    }
}

一旦我完成了以上所有操作,错误就消失了,一切都正常了。

 类似资料:
  • 在将Django docker容器连接到Postgres数据库时,我收到以下错误。 下面是运行容器的Dockerfile pg_hba.conf->宿主all all 0.0.0.0/0 md5 我已经读到上面的以下细节打开数据库上的连接。

  • 我试图连接到银行,但它给出了这个错误,当我尝试: 应用程序无法启动 描述: 未能配置数据源:无法配置嵌入式数据源。 原因:未能确定合适的驱动程序级别 行动: 考虑下面的内容:如果你想要一个嵌入式数据库(H2,HSQL或DeBy),请把它放在类路径上。如果要从特定配置文件加载数据库设置,则可能需要激活它(当前没有激活的配置文件)。 我的应用程序属性: 我的pom:

  • 如何用Python访问linux服务器机器上的postgre数据库?我已经用putty终端访问了它,但我需要通过python访问数据库中的表,我无法做到这一点。

  • 创建数据库后,必须连接或启动数据库才能正常使用。 语法: 示例: 假设要连接 数据库,参考以下代码: 执行上面命令,得到以下结果:

  • 主要内容:使用SQL * Plus连接到Oracle数据库服务器,使用SQL Developer连接到Oracle数据库服务器在本教程中,您将学习如何使用和SQL Developer 工具连接到Oracle数据库服务器。 使用SQL * Plus连接到Oracle数据库服务器 是安装Oracle数据库服务器或客户端时自动安装的交互式查询工具。 有一个命令行界面,允许您连接到Oracle数据库服务器并交互执行语句。 注意:如果有使用过MySQL或PostgreSQL,与MySQL中的mysql程序

  • 在连接之前,你需要一个受支持的驱动。下面是一些测试过的驱动及其版本,把你所需要的加入到package.json中。 驱动 npm 包 版本 mysql mysql 2.0.0-alpha9 postgres redshift pg 2.6.2 [1] sqlite sqlite3 2.1.7 mongodb mongodb 1.3.19 [1] 如果你要连接到Heroku,请使用版本2.5.0。