如何使用 spring-batch 将 univocity 返回的项目列表写入数据库
How to use spring-batch to write the list of items returned by univocity into a database
我有一系列步骤,包括:
- 第 1 步:从数据库读取并写入 csv(第一段)
- 第 2 步:从数据库读取并写入 csv(第二段)
- 第 3 步:将 spring-batch 与 Univocity 集成以比较来自第一站和第二站的 CSV
- Step4:Return比较后的匹配项列表
- Step5:将列表写入数据库
- Step6:从数据库读取到csv
我卡在了第 5 步。我不知道如何使用 spring-batch 直接从列表写入数据库。
我曾尝试使用 jdbc batchUpdate,但我遇到了 "connection closed" 个问题。
这是我的 RestController class:
第一项工作 "job" 处理步骤 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
I have no idea how to use spring-batch to write directly from a list to a database.
有一个 ListItemReader 可用于从列表中读取项目。要将项目写入数据库,可以使用 JdbcBatchItemWriter
。因此,您的第 5 步可以是使用那些 reader/writer.
的面向块的步骤
The first job "job" handles Steps 1-4. The second invocation(readFromPtrxList()) inserts the items in the list into database while the second job "pjob" reads from the database and writes to a csv file
您的错误似乎是由于您同时 运行 两项工作并共享同一个连接。我相信您描述的所有步骤都可以成为一项工作的一部分。 step 4产生的列表可以传给step 5写入:如果比较小,可以使用execution context传过去,否则可以使用中间的临时存储(比如staging table或者a文件)以在这些步骤之间共享数据。
我有一系列步骤,包括:
- 第 1 步:从数据库读取并写入 csv(第一段)
- 第 2 步:从数据库读取并写入 csv(第二段)
- 第 3 步:将 spring-batch 与 Univocity 集成以比较来自第一站和第二站的 CSV
- Step4:Return比较后的匹配项列表
- Step5:将列表写入数据库
- Step6:从数据库读取到csv
我卡在了第 5 步。我不知道如何使用 spring-batch 直接从列表写入数据库。
我曾尝试使用 jdbc batchUpdate,但我遇到了 "connection closed" 个问题。
这是我的 RestController class: 第一项工作 "job" 处理步骤 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
I have no idea how to use spring-batch to write directly from a list to a database.
有一个 ListItemReader 可用于从列表中读取项目。要将项目写入数据库,可以使用 JdbcBatchItemWriter
。因此,您的第 5 步可以是使用那些 reader/writer.
The first job "job" handles Steps 1-4. The second invocation(readFromPtrxList()) inserts the items in the list into database while the second job "pjob" reads from the database and writes to a csv file
您的错误似乎是由于您同时 运行 两项工作并共享同一个连接。我相信您描述的所有步骤都可以成为一项工作的一部分。 step 4产生的列表可以传给step 5写入:如果比较小,可以使用execution context传过去,否则可以使用中间的临时存储(比如staging table或者a文件)以在这些步骤之间共享数据。