首页 > 解决方案 > 如何使用spring-batch将univocity返回的项目列表写入数据库

问题描述

我有一系列步骤,其中包括:

我被困在第5步。我不知道如何使用 spring-batch 直接从列表写入数据库。

我曾尝试使用 jdbc batchUpdate,但遇到“连接关闭”问题。

这是我的 RestController 类:第一个作业“作业”处理步骤 1-4。第二个调用(readFromPtrxList())将列表中的项目插入数据库,而第二个作业“pjob”从数据库读取并写入 csv 文件:

public void executeManualJob(@PathVariable String report) {
    try {
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("report", report)
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        jobLauncher.run(job, jobParameters).getExitStatus().getExitCode();
        ptrxList.readFromPtrxList();
        jobLauncher.run(pjob,jobParameters).getExitStatus().getExitCode();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是执行步骤 5 时的错误消息:

Caused by: org.hibernate.TransactionException: Unable to commit against JDBC Connection
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:87) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:272) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:533) ~[spring-orm-5.1.10.RELEASE.jar:5.1.10.RELEASE]
... 74 common frames omitted
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:782) ~[postgresql-42.2.8.jar:42.2.8]
at org.postgresql.jdbc.PgConnection.commit(PgConnection.java:768) ~[postgresql-42.2.8.jar:42.2.8]
at com.zaxxer.hikari.pool.ProxyConnection.commit(ProxyConnection.java:361) ~[HikariCP-3.2.0.jar:na]
at com.zaxxer.hikari.pool.HikariProxyConnection.commit(HikariProxyConnection.java) ~[HikariCP-3.2.0.jar:na]
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.commit(AbstractLogicalConnectionImplementor.java:81) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
... 77 common frames omitted

标签: springlistspring-batchunivocity

解决方案


我不知道如何使用 spring-batch 直接从列表写入数据库。

您可以使用ListItemReader从列表中读取项目。要将项目写入数据库,您可以使用JdbcBatchItemWriter. 因此,您的第 5 步可以是使用这些读取器/写入器的面向块的步骤。

第一个作业“作业”处理步骤 1-4。第二个调用(readFromPtrxList())将列表中的项目插入数据库,而第二个作业“pjob”从数据库读取并写入 csv 文件

您的错误似乎是由于您同时运行两个作业并共享相同的连接。我相信您描述的所有步骤都可以成为一项工作的一部分。第4步产生的列表可以传给第5步写:如果比较小,可以使用执行上下文传递,否则可以使用中间临时存储(比如staging table或者文件)来共享这些步骤之间的数据。


推荐阅读