使用Job scheduler执行JobNet可能会发生死锁。
【发生条件】
使用Microsoft SQL Server
当删除或更新Job scheduler使用的表的记录时,会执行不必要的隐式类型转换,从而很容易执行表扫描。
执行表扫描时,会逐页获取锁,这可能会导致死锁。
在本FAQ中,将记载处理上述现象的对应方法。
【解决方法】
确保不进行不必要的隐式类型转换。
请下载并应用附加模块(im_job_scheduler_8_0_7_later_specific_patch-1.0.0.imm)。
*在应用附加模块之前,请确认下面记载的注意事项和应用(安装)方法。
【模块中包含的改善/修改需求】
附加模块中包含的需求如下。
使用Job scheduler执行JobNet可能会发生死锁。
https://issue.intra-mart.jp/issues/29271
【注意事项】
1. 附加模块可适用于intra-mart Accel Platform 2014 Spring (Granada)以后的版本。
2.虽然我们已经进行了彻底的测试,但在应用于您的环境时,请务必进行自行检查操作。
3. 其他,请遵守以下产品的限制事项。
intra-mart Accel Platform 2014 Spring (Granada) 及左侧列出的更新产品
4. 附加模块在intra-mart Accel Platform启动时,仅执行一次将以下表的VARCHAR类型更改为NVARCHAR类型的SQL(*1)。
* imjob_monitor(管理JobNet的执行状况和执行结果的表)
* imjob_monitor_task(管理监视器上每个Job的详细信息任务信息的表)
由于上表中的所有记录都被复制两次,因此如果记录较多,预计应用附加模块后首次启动intra-mart Accel Platform 需要一些时间。
因此,请在您有时间的时候进行。
这是一个参考值,但当我们验证它时,在以下条件下启动intra-mart Accel Platform大约需要20分钟。
・imjob_monitor:约200万个
・imjob_monitor_task:约800万个
第二次及以后的启动将不会被执行。
*1. 将更改NVARCHAR类型的SQL
========================================================
CREATE TABLE imjob_monitor_bk (
tenant_id VARCHAR(100) NOT NULL,
id VARCHAR(200) NOT NULL,
jobnet_id VARCHAR(200) NOT NULL,
trigger_id VARCHAR(200) NOT NULL,
status VARCHAR(24) NOT NULL,
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, id)
);
INSERT INTO imjob_monitor_bk SELECT * FROM imjob_monitor;
DROP TABLE imjob_monitor;
CREATE TABLE imjob_monitor (
tenant_id NVARCHAR(100) NOT NULL,
id NVARCHAR(200) NOT NULL,
jobnet_id NVARCHAR(200) NOT NULL,
trigger_id NVARCHAR(200) NOT NULL,
status NVARCHAR(24) NOT NULL,
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd NVARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd NVARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, id)
);
INSERT INTO imjob_monitor SELECT * FROM imjob_monitor_bk;
DROP TABLE imjob_monitor_bk;
CREATE TABLE imjob_monitor_task_bk (
tenant_id VARCHAR(100) NOT NULL,
monitor_id VARCHAR(200) NOT NULL,
task_id VARCHAR(200) NOT NULL,
job_id VARCHAR(200) NOT NULL,
status VARCHAR(24),
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, monitor_id, task_id)
);
INSERT INTO imjob_monitor_task_bk SELECT * FROM imjob_monitor_task;
DROP TABLE imjob_monitor_task;
CREATE TABLE imjob_monitor_task (
tenant_id NVARCHAR(100) NOT NULL,
monitor_id NVARCHAR(200) NOT NULL,
task_id NVARCHAR(50) NOT NULL,
job_id NVARCHAR(200) NOT NULL,
status NVARCHAR(24),
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd NVARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd NVARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, monitor_id, task_id)
);
INSERT INTO imjob_monitor_task SELECT * FROM imjob_monitor_task_bk;
DROP TABLE imjob_monitor_task_bk;
========================================================
【应用(安装)方法】
1. 启动IM-Juggling。
2. 打开现有项目(juggling.im)文件。
3. 选择“用户模块”选项卡,点击右上角的“+”图标。
4. 添加下载的im_job_scheduler_8_0_7_later_specific_patch-1.0.0.imm 文件。
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/create_war/user_module.html
5. 进行WAR文件(※1)和静态文件(※2)的输出。
6. 请进行卸载。
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/uninstallation/index.html#war
7. 卸载后,请部署文件*1和*2。
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/deploy/index.html
【卸载方法】
1. 打开IM-Juggling项目,删除本FAQ中添加的用户模块。
选择用户模块后,单击右上角的“X”图标即可删除该用户模块。
2. 进行WAR文件(*3)和静态文件(*4)的输出。
3. 请进行卸载。
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/uninstallation/index.html#war
4. 在系统数据库中请执行以下SQL。
*在目的只是卸载附加模块的情况下,无需执行SQL,但如果目的是更新产品,则需要执行SQL。
========================================================
CREATE TABLE imjob_monitor_bk (
tenant_id VARCHAR(100) NOT NULL,
id VARCHAR(200) NOT NULL,
jobnet_id VARCHAR(200) NOT NULL,
trigger_id VARCHAR(200) NOT NULL,
status VARCHAR(24) NOT NULL,
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, id)
);
INSERT INTO imjob_monitor_bk SELECT * FROM imjob_monitor;
DROP TABLE imjob_monitor;
CREATE TABLE imjob_monitor (
tenant_id VARCHAR(100) NOT NULL,
id VARCHAR(200) NOT NULL,
jobnet_id VARCHAR(200) NOT NULL,
trigger_id VARCHAR(200) NOT NULL,
status VARCHAR(24) NOT NULL,
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, id)
);
INSERT INTO imjob_monitor SELECT * FROM imjob_monitor_bk;
DROP TABLE imjob_monitor_bk;
CREATE TABLE imjob_monitor_task_bk (
tenant_id VARCHAR(100) NOT NULL,
monitor_id VARCHAR(200) NOT NULL,
task_id VARCHAR(200) NOT NULL,
job_id VARCHAR(200) NOT NULL,
status VARCHAR(24),
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, monitor_id, task_id)
);
INSERT INTO imjob_monitor_task_bk SELECT * FROM imjob_monitor_task;
DROP TABLE imjob_monitor_task;
CREATE TABLE imjob_monitor_task (
tenant_id VARCHAR(100) NOT NULL,
monitor_id VARCHAR(200) NOT NULL,
task_id VARCHAR(200) NOT NULL,
job_id VARCHAR(200) NOT NULL,
status VARCHAR(24),
start_date_time DECIMAL(13,0) NOT NULL,
end_date_time DECIMAL(13,0),
message NVARCHAR(1000),
create_user_cd VARCHAR(100) NOT NULL,
create_date DATETIME2 NOT NULL,
record_user_cd VARCHAR(100) NOT NULL,
record_date DATETIME2 NOT NULL,
PRIMARY KEY (tenant_id, monitor_id, task_id)
);
INSERT INTO imjob_monitor_task SELECT * FROM imjob_monitor_task_bk;
DROP TABLE imjob_monitor_task_bk;
========================================================
5. 卸载后,请部署文件*3和*4。
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/deploy/index.html
-- 适用对象 -------------------------------------------------------------------------
iAP/Accel Platform/2023 Autumn
iAP/Accel Platform/2023 Spring
iAP/Accel Platform/2022 Winter
iAP/Accel Platform/2022 Spring
iAP/Accel Platform/2021 Winter
iAP/Accel Platform/2021 Summer
iAP/Accel Platform/2021 Spring
iAP/Accel Platform/2020 Winter
iAP/Accel Platform/2020 Summer
iAP/Accel Platform/2020 Spring
iAP/Accel Platform/2019 Winter
iAP/Accel Platform/2019 Summer
iAP/Accel Platform/2019 Spring
iAP/Accel Platform/2018 Winter
iAP/Accel Platform/2018 Summer
iAP/Accel Platform/2018 Spring
iAP/Accel Platform/2017 Winter
iAP/Accel Platform/2017 Summer
iAP/Accel Platform/2017 Spring
iAP/Accel Platform/2016 Winter
iAP/Accel Platform/2016 Summer
iAP/Accel Platform/2016 Spring
iAP/Accel Platform/2015 Winter
iAP/Accel Platform/2015 Summer
iAP/Accel Platform/2015 Spring
iAP/Accel Platform/2014 Winter
iAP/Accel Platform/2014 Summer
iAP/Accel Platform/2014 Spring
--------------------------------------------------------------------------------
FAQID:1300
使用Job scheduler执行JobNet可能会发生死锁。