如何在Spring批处理中使用JdbcItemWriter实现DB2 ZOS的合并语句?



我需要从一个数据库读取50K记录,然后将这些记录插入或更新到另一个数据库。读取需要几秒钟。但是,即使使用多线程,对这50K条记录的插入/更新也要花费23分钟。我一直在玩页面,获取和批处理大小,但性能并没有提高那么多。

是否有一种方法来实现这种类型的JdbcItemWriter语句?

-- hv_nrows = 3
-- hv_activity(1) = 'D'; hv_description(1) = 'Dance'; hv_date(1) = '03/01/07'
-- hv_activity(2) = 'S'; hv_description(2) = 'Singing'; hv_date(2) = '03/17/07'
-- hv_activity(3) = 'T'; hv_description(3) = 'Tai-chi'; hv_date(3) = '05/01/07'
-- hv_group = 'A';
-- note that hv_group is not an array. All 3 values contain the same values
MERGE INTO RECORDS AR
USING (VALUES (:hv_activity, :hv_description, :hv_date, :hv_group)
FOR :hv_nrows ROWS)
AS AC (ACTIVITY, DESCRIPTION, DATE, GROUP)
ON AR.ACTIVITY = AC.ACTIVITY AND AR.GROUP = AC.GROUP
WHEN MATCHED 
THEN UPDATE SET (DESCRIPTION, DATE, LAST_MODIFIED)
= (AC.DESCRIPTION, AC.DATE, CURRENT TIMESTAMP)
WHEN NOT MATCHED
THEN INSERT (GROUP, ACTIVITY, DESCRIPTION, DATE, LAST_MODIFIED)
VALUES (AC.GROUP, AC.ACTIVITY, AC.DESCRIPTION, AC.DATE, CURRENT TIMESTAMP)
NOT ATOMIC CONTINUE ON SQLEXCEPTION;

我的想法是发送一堆行合并一次,看看性能是否提高。

我试过这样做:

MERGE INTO TEST.DEST_TABLE A 
USING (
('00000031955190','0107737793'),
('00000118659978','0107828212'),
('00000118978436','0095878120'),
('00000122944473','0106845043')
) AS B(CDFILIAC,CDRFC)
ON A.CDFILIAC = B.CDFILIAC
WHEN MATCHED THEN 
UPDATE SET 
A.CDRFC=B.CDRFC,
A.CDNUMPOL=B.CDNUMPOL

虽然它适用于DB2 LUW,但不适用于DB2 ZOS。

是否有办法在JdbcItemWriter中实现这种语句?

JdbcBatchItemWriter委托org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations。因此,如果NamedParameterJdbcOperations从Spring框架支持这种查询,Spring批处理也。否则,您将需要创建一个自定义写入器。

虽然它适用于DB2 LUW,但不适用于DB2 ZOS。

Spring Batch在这个级别无法提供帮助,因为这似乎是特定于DB的。

最新更新