首页 > 解决方案 > 如何在 SQL Server 中截断 Spring Batch 作业表

问题描述

我开发了 Spring Batch Jobs 来处理数十万个平面文件。该程序长时间运行正常。之后,批处理表的行数和作业的执行时间增加。

我试图截断这些表。我看到,我应该放弃一些禁用的限制。然后,我最后截断了表,添加了之前删除的约束。该代码如下所示,与主程序(文件处理)同时工作。


ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION] drop CONSTRAINT [JOB2_EXEC_STEP_FK]
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION] drop CONSTRAINT [JOB2_INST_EXEC_FK]
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_PARAMS] drop CONSTRAINT [JOB2_EXEC_PARAMS_FK]
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_CONTEXT] drop CONSTRAINT [JOB2_EXEC_CTX_FK]
ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION_CONTEXT] drop CONSTRAINT [STEP2_EXEC_CTX_FK]


truncate table BATCH2_JOB_EXECUTION_PARAMS
truncate table BATCH2_JOB_EXECUTION_CONTEXT
truncate table BATCH2_JOB_INSTANCE
truncate table BATCH2_JOB_EXECUTION
truncate table BATCH2_STEP_EXECUTION
truncate table BATCH2_STEP_EXECUTION_CONTEXT


ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_PARAMS]  WITH CHECK ADD  CONSTRAINT [JOB2_EXEC_PARAMS_FK] FOREIGN KEY([JOB_EXECUTION_ID])
REFERENCES [dbo].[BATCH2_JOB_EXECUTION] ([JOB_EXECUTION_ID])
GO
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_PARAMS] CHECK CONSTRAINT [JOB2_EXEC_PARAMS_FK]
GO

ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_CONTEXT]  WITH CHECK ADD  CONSTRAINT [JOB2_EXEC_CTX_FK] FOREIGN KEY([JOB_EXECUTION_ID])
REFERENCES [dbo].[BATCH2_JOB_EXECUTION] ([JOB_EXECUTION_ID])
GO
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION_CONTEXT] CHECK CONSTRAINT [JOB2_EXEC_CTX_FK]
GO

ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION]  WITH CHECK ADD  CONSTRAINT [JOB2_INST_EXEC_FK] FOREIGN KEY([JOB_INSTANCE_ID])
REFERENCES [dbo].[BATCH2_JOB_INSTANCE] ([JOB_INSTANCE_ID])
GO
ALTER TABLE [dbo].[BATCH2_JOB_EXECUTION] CHECK CONSTRAINT [JOB2_INST_EXEC_FK]
GO

ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION]  WITH CHECK ADD  CONSTRAINT [JOB2_EXEC_STEP_FK] FOREIGN KEY([JOB_EXECUTION_ID])
REFERENCES [dbo].[BATCH2_JOB_EXECUTION] ([JOB_EXECUTION_ID])
GO
ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION] CHECK CONSTRAINT [JOB2_EXEC_STEP_FK]
GO

ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION_CONTEXT]  WITH CHECK ADD  CONSTRAINT [STEP2_EXEC_CTX_FK] FOREIGN KEY([STEP_EXECUTION_ID])
REFERENCES [dbo].[BATCH2_STEP_EXECUTION] ([STEP_EXECUTION_ID])
GO
ALTER TABLE [dbo].[BATCH2_STEP_EXECUTION_CONTEXT] CHECK CONSTRAINT [STEP2_EXEC_CTX_FK]
GO

有时,我会收到此错误

Msg 3728, Level 16, State 1, Line 4
'JOB2_EXEC_STEP_FK' is not a constraint.
Msg 3727, Level 16, State 0, Line 4
Could not drop constraint. See previous errors.
Msg 2714, Level 16, State 5, Line 27
There is already an object named 'JOB2_EXEC_CTX_FK' in the database.
Msg 1750, Level 16, State 1, Line 27
Could not create constraint or index. See previous errors.
Msg 2714, Level 16, State 5, Line 35
There is already an object named 'JOB2_INST_EXEC_FK' in the database.
Msg 1750, Level 16, State 1, Line 35
Could not create constraint or index. See previous errors.
Msg 547, Level 16, State 0, Line 43
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "JOB2_EXEC_STEP_FK". The conflict occurred in database "db_name", table "dbo.BATCH2_JOB_EXECUTION", column 'JOB_EXECUTION_ID'.
Msg 4917, Level 16, State 0, Line 47
Constraint 'JOB2_EXEC_STEP_FK' does not exist.
Msg 4916, Level 16, State 0, Line 47
Could not enable or disable the constraint. See previous errors.

我该如何解决这种情况?非常感谢。

标签: javasql-serverspring-mvcspring-batch

解决方案


经过长时间的研究,我发现了一种最简单的方法。

  1. 使用这个库。源代码在 github 上是公开的,您可以在其中看到阅读此测试的示例。

  2. 手动:首先确保您的服务器没有运行作业。然后,如果您使用的是 sql server,您可以在此处在您的数据库中运行官方 drop schema 脚本。或者,如果您使用其他数据库,您可以在此处找到适合您的脚本。然后,您可以通过两种方式重新创建架构:

一个。使用官方脚本手动完成。如果您使用 sql server 或在此处搜索最佳选项,请查看此处

湾。spring.batch.initialize-schema将属性打开到always。然后重新启动您的服务器以自动重新创建春季批处理模式。

spring.batch.initialize-schema=总是


推荐阅读