1, 版本
PostgreSQL 14.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2,问题
2023/04/28 10:22:53 - bpm_pro - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : Because of an error, this step can't continue:
2023/04/28 10:22:53 - bpm_pro - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2023/04/28 10:22:53 - bpm_pro - Error performing rollback on connection
2023/04/28 10:22:53 - bpm_pro - This connection has been closed.
2023/04/28 10:22:53 - bpm_pro -
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.core.database.Database.rollback(Database.java:902)
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.core.database.Database.rollback(Database.java:880)
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:339)
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.trans.steps.tableoutput.TableOutput.processRow(TableOutput.java:125)
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2023/04/28 10:22:53 - bpm_pro - at java.lang.Thread.run(Thread.java:748)
2023/04/28 10:22:53 - bpm_pro - Caused by: org.postgresql.util.PSQLException: This connection has been closed.
2023/04/28 10:22:53 - bpm_pro - at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:907)
2023/04/28 10:22:53 - bpm_pro - at org.postgresql.jdbc.PgConnection.rollback(PgConnection.java:914)
2023/04/28 10:22:53 - bpm_pro - at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)
2023/04/28 10:22:53 - bpm_pro - at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:323)
2023/04/28 10:22:53 - bpm_pro - at org.pentaho.di.core.database.Database.rollback(Database.java:893)
2023/04/28 10:22:53 - bpm_pro - ... 5 more
3,解决方法
问题分析
表面上看是在rollback的时候连接已经关闭了,但是为什么同样的数据有时候就不报错呢,那么问题应用就是在做正常表输出的时候已经发生了异常(连接关闭)然后被 catch,在执行rollback前程序只判断了连接是否为空并没有判断连接是否关闭,这就会出现以上的错误信息。
解决方法
连接池配置
- 自动回收机制 removeAbandoned
- removeAbandoned=“true”
- removeAbandonedTimeout=“600”
- logAbandoned=“true”