如何在SQL Server中截断Spring Batch作业表

时间:2019-05-06 07:18:19

标签: java sql-server spring-mvc 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.

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

1 个答案:

答案 0 :(得分:1)

经过长时间的研究,我发现了一种干净的方法。

  1. 使用this库。源代码在github上公开,您可以在其中看到阅读this test的示例。

  2. 手动:首先,确保服务器未运行作业。然后,如果您使用的是sql server,则可以在此处的数据库中运行Official drop schema script。或者,如果您正在使用其他数据库,则可以为您here找到一个脚本。然后,您可以通过两种方式重新创建模式:

    1. 使用官方脚本手动执行。如果您使用的是SQL Server,请查看here或搜索最佳选择here
    2. spring.batch.initialize-schema属性设置为always。然后重新启动服务器以自动进行Spring Batch架构重新创建。

spring.batch.initialize-schema =总是