jdbc批量更新_用集算器更新数据库的技巧

对数据库进行批量更新时,使用update函数要比execute函数性能更好。

比如,source和target是两个不同的数据源,callrecordA是source中的物理表,有1万条记录,callrecordB是target中的物理表,无记录,现在需要将callrecordA中的数据同步到callrecordB中。

当使用execute函数进行批量更新,可以发现性能不够理想,代码如下:

c43853fb7da4d4ecb3ee19e75c385a45.png

上述算法实际是循环执行insert语句,并没有充分利用JDBC的批量更新机制,因此性能较差。而且上述算法只是插入数据,如果既有插入又有修改,处理起来会麻烦许多。

使用update函数后,可以看到性能提升明显,代码如下:

84539af3168384c722309b03161b2788.png

函数update利用JDBC的executeBatch机制进行批量更新,因此性能较好。选项@i表示只需生成insert语句,@u表示只生成update语句。无选项时表示既有insert又有update,即目标表已有数据,需比对源表和目标表的主键,如果某主键在源表存在,在目标表不存在,则生成insert语句,如果某主键在源表和目标表都存在,则生成update语句。

数据库通常会提供同步/导入工具,这些工具通常具备更好的性能,也都支持命令行调用。SPL可执行命令行,因此可以调用这些工具。比如用oracle的sqlldr导入数据,可使用如下代码:

4202fa9f19b71493ca4ecaa401ee5d1d.png

A1-A3:将source中的表导出成文本文件,分隔符为|。文本文件如果已存在,则可省略本步骤。

A4:执行命令行,调用sqlldr,命令格式要符合sqlldr的官方要求。注意callrecordB.ctl 是sqlldr要求的控制文件,格式如下:

load data

CHARACTERSET UTF8

append

into table callrecordB

fields terminated by '|'

trailing nullcols

(

SERIALNUMBER INTEGER EXTERNAL,

OUTID INTEGER EXTERNAL,

INID INTEGER EXTERNAL,

CALLTIME date "yyyy-mm-dd hh24:mi:ss",

DURATION INTEGER EXTERNAL,

CHARGE INTEGER EXTERNAL

)

SPL支持并行计算,包括并行执行同步/导入工具,所以可以将单文本拆成多个文本,同时导入多个文件,以此获得更高性能。不同的同步/导入工具,有不同的并行要求,通常的要求是不锁表,且无唯一索引。比如并行执行sqlldr,可用如下代码:

b868e3aa11e0c40c628f59119a97d938.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值