关键字:
KingbaseES、JDBC、批量传输、人大金仓、KingbaseES
场景介绍
在数据库使用过程中,不可避免的会遇到大批量数据插入的场景,为了完成数据传输,用户端与数据库服务端会频繁的进行交互,耗费大量的时间。因此,需要对批量数据进行处理,以提高传输的效率。
功能介绍
Kingbase-JDBC提供了一种批量插入语句传输优化功能,该功能的示意图如图1所示。针对用户输入的大量数据插入请求,该功能通过语句解析识别请求,然后通过语句改写的方式,将多组数据插入请求合并为一组数据插入请求,从而减少网络交互的次数,显著提高数据传输效率。
行转列的批量传输优化功能的具体流程如图2所示,用户输入批量数据插入请求,内部执行函数判断该连接是否启用批量插入优化功能,若是,则根据内置的映射规则和语句所绑定的参数个数,计算单次传输的最大数据组数,然后计算出总计所需进行的数据传输次数。根据语句绑定参数个数确定合理的单次数据传输最大组数,可以有效利用网络带宽以及控制网络交互次数。接着循环进行传输优化和数据传输:判断剩余待传输数据组数是否大于等于单次最大传输组数,若是,则合并等同最大传输组数的数据为一行数据,并缓存合并后的语句及对应的参数数据;若不是,则以不大于剩余传输组数的2的最大整数幂,为本次传输的数据组数,合并数据并缓存,直到剩余数据优化完毕。以128为传输组数上限,并每次发送2的整数幂组数据,是参考了通信协议中的Parse报文格式,并合理复用。
图1:行转列批量传输优化方法示意图
图2:行转列批量传输优化方法的实现流程图
使用方法
使用批量插入语句传输优化功能,需要配置参数reWriteBatchedInserts = TRUE,该功能默认是不启用状态。
下图3展示了含2个绑定参数的批量插入语句优化前后性能的对比结果,可以明显的观察出,随着传输数据量的增大,非传输优化模式所需要的传输时间迅速提升,而传输优化模式所需要的传输时间提升相对缓慢。
图3:含2个绑定参数的批量插入语句优化前后性能对比图
BUG修复
在使用过程中,发现该功能存在如下BUG:当语句绑定参数为0时,批量传输优化报错,具体情况如图4所示。
图4: 0个绑定参数语句批量传输异常
原因:当语句绑定参数为0时,设置的批量传输优化语句数目是1024,但是后续最大批量传输优化数目设置值是128,因此直接抛出异常。
修改方法:将绑定参数为0时的传输优化语句数目设置成128,同后续代码逻辑保持一致。
参考文档:
无