我正在尝试将DB2源设置为Batch元数据的持久性.我得到这个堆栈跟踪:
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED, VERSION, JOB_CONFIGURATION_LOCATION from rhall.BATCH_JOB_EXECUTION where JOB_INSTANCE_ID = ? order by JOB_EXECUTION_ID desc]; SQL state [null]; error code [-4470]; [jcc][t4][10120][10898][3.57.82] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null; nested exception is com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.57.82] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:777)
at org.springframework.batch.core.repository.dao.JdbcJobExecutionDao.findJobExecutions(JdbcJobExecutionDao.java:131)
at org.springframework.batch.core.repository.support.SimpleJobRepository.getStepExecutionCount(SimpleJobRepository.java:253)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native …Run Code Online (Sandbox Code Playgroud) 我正在使用带有liquibase-maven-plugin的spring-boot来根据我的类生成数据库更改,但是"mvn compile liquibase:diff"命令总是会生成索引和外键的删除和包含,即使数据库已更新并且类没有变化(因此数据库中应该没有变化).
任何人都知道这是对的还是如何避免它?我只想在项目的变更集中生成对数据库的新更改.
我们的处理器返回List<?>(有效传递a List<List<?>>)到我们的ItemWriter.
现在,我们观察到JdbcBatchItemWriter没有编程处理item instanceof List.我们还观察到了处理项目instanceof List; 我们需要写一个自定义ItemSqlParameterSourceProvider.
但令人遗憾的是,它返回的SqlParameterSource只能处理一个item并且再也无法处理一个List.
那么,有人可以帮助我们了解如何处理列表中的列表JdbcBatchItemWriter吗?
我们的一个 ETL 应用程序遇到了一个奇怪的问题。实际上,该过程打开一个游标以从一个数据库中提取数据,执行一些转换,然后使用批量插入插入到另一个数据库中。
对于 ETL 中的所有表,我们的提交间隔设置为 1000 行。因此,在读取 1k 行的每个块并执行转换后,我们对目标数据库执行一次批量插入(使用 Java、Spring Batch、OJDBC7 v12.1.0.2)。
然而,有些表的速度非常慢。我们首先确保 FK 已关闭(确实如此)。然后我们检查以确保触发器已被禁用(它们是)。我们添加了日志记录来获取每个批量插入中的行(除了每个线程的最终插入之外,它是 1000 行)。
最后,查询v$sql,对于某些表,我们看到每次执行接近 1000 行,这正是我们所期望的。然而,对于痛苦的表,它通常徘徊在接近一个!我们预计大多数表的数据量都在 900 左右,因为线程的最终提交可能没有完整的 1k 行,但某些表上每次执行的异常低的行数确实令人头疼。
一些宽表(100+列)有问题,但其他的则没问题。一些高度分区(100+分区)的表很慢,但其他表则很好。所以我很困惑。有没有人见过这个?我的想法已经用完了!
谢谢!
这是我们看到的内容v$sql(表名被混淆):
SELECT *
FROM
(SELECT REGEXP_SUBSTR (sql_text, 'Insert into [^\(]*') sql_text,
sql_id,
TRUNC(
CASE
WHEN SUM (executions) > 0
THEN SUM (rows_processed) / SUM (executions)
END,2) rows_per_execution
FROM v$sql
WHERE parsing_schema_name = 'PFT010_RAPP_PRO'
AND sql_text LIKE 'Insert into%'
GROUP BY sql_text,
sql_id
)
ORDER BY rows_per_execution ASC; …Run Code Online (Sandbox Code Playgroud) java ×3
spring-batch ×2
db2 ×1
etl ×1
liquibase ×1
maven ×1
oracle ×1
oracle12c ×1
spring ×1
spring-boot ×1