Java ibatis批量insert_java – 使用IBATIS进行INSERTS的最快方法

除非其他人指的是批量加载器,让我们考虑如何通过SQL做到最好. (如果您将混合数据发送到不同的表,则批量加载器无法正常工作.)

首先,你不应该使用你正在使用的任何抽象层,在这种情况下是iBatis,因为它实际上会为你提供很少的价值,但是抽象层将有一些(不一定是很多,但有些)CPU成本.您应该只使用原始数据库连接.

接下来,您将发送一堆INSERT语句.问题是你是否应该使用一个简单的字符串作为参数(即INSERT INTO TABLE1 VALUES(‘x’,’y’,12))vs一个预备语句(INSERT INTO TABLE1 VALUES(?,?,?)).

这取决于您的数据库和数据库驱动程序.

使用简单字符串的问题基本上是内部格式(假设您正在插入Java数据)到字符串的转换成本.将数字或日期转换为String实际上是一个相当昂贵的CPU操作.一些数据库和驱动程序将直接使用二进制数据,而不仅仅是字符串数据.因此,在这种情况下,PreparedStatement可以节省一些CPU节省,而不必转换数据.

缺点是这个因素会因数据库供应商而有所不同,甚至可能是JDBC供应商.例如,Postgres(我相信)仅适用于SQL字符串,而不是二进制文件,因此使用PreparedStatement对于简单地自己构建字符串是一种浪费.

接下来,一旦有了语句类型,就要使用JDBC Statement类的addBatch()方法. addBatch的作用是将SQL语句组合成一个批处理.好处是,您可以发送一个LARGE请求,而不是向DB发送多个请求.这样可以减少网络流量,并且可以显着提高吞吐量.

细节是并非所有驱动程序/数据库都支持addBatch(至少不是很好),但批量的大小也是有限的.您很可能无法为所有20,000行添加addBatch并期望它能够正常工作,尽管这将是最好的选择.此限制也可能因数据库而异.

对于Oracle,在过去,我使用了64K的缓冲区.基本上我写了一个包装器函数,它将采用文字INSERT语句,并以64K批次累积它们.

因此,如果您希望通过JDBC批量插入数据,那么这就是实现它的方法.最大的改进是Batch模式,Statement vs PreparedStatement更可能节省一些CPU,如果您的驱动程序支持二进制协议,则可能是网络流量.

测试,冲洗并重复,直到你足够快乐.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值