我有一个场景,比如我想阅读一个包含大约2000条记录的电子表格,并将其输入数据库。
目前我们正在使用Executor框架。我们有限制,任务不应该只有5.每个任务从excel中读取20行。我们提供要从excel读取到每个任务的行的起始索引和结束索引。
说,目前,
任务1处理1-20
任务-2处理21-40
任务-3处理41-60
任务-4处理61-80
任务-5处理81-100
如果Task-1完成执行,则接下来的20行是101-120。如果Task-2在Task-1之前完成,它将从121-140而不是101-120开始读取。 />
我是否可以在Fork-Join框架中更有效地处理这种情况,只限制5个任务,每个任务20行?
需要深入了解性能问题。
答案 0 :(得分:3)
无需切换线程池。为了使负载更加平衡,您可以只维护原子变量,该变量指向第一个未采用的行:
CREATE PROCEDURE [dbo].[updatestuff]
@update1 AS udtupdate1 READONLY ,
@update2 AS udtupdate2 READONLY ,
@time DATETIME
AS
BEGIN
SET NOCOUNT ON
-- uses udtupdate1
UPDATE lms
SET lms.col1 = lsp.col1 ,
lms.TimeStamp = @time
FROM dbo.tlivetable1 lms
INNER JOIN @update1 lsp ON lms.livetable1Id = lsp.colId
UPDATE ms
SET ms.col1 = lsp.col1 ,
ms.TimeStamp = @time
FROM dbo.tmrks ms
INNER JOIN @update1 lsp ON ms.mrksId = lsp.Colid
-- uses udtupdate2
UPDATE mms
SET mms.col2 = msp.col2 ,
mms.Date = @time
FROM dbo.tMMSel mms
INNER JOIN @update2 msp ON msp.col1Id = mms.MMId
AND msp.col2Id = mms.MMSId
END
每项任务的主体都是完全一样的。此实现也不依赖于创建的任务数。如果您以后决定有3个任务或7个任务,只需调整线程池大小并提交更多(或更少)任务。