@[TOC]上周,兄弟歌曲转载了一份数据批次插入文章。我与您讨论了批处理数据插入的问题。
阅读文章后,一个小朋友提出了不同的意见:
Song兄弟与Bug交谈,并基本上理解了这个小朋友的含义,所以我本人也写了一个测试案例,今天对本文进行了组织,我希望能与我的朋友讨论这个问题。小朋友提出了一个更好的计划。
在插入此问题的批处理中,我们使用JDBC进行操作,但实际上是两个想法:
哪个快?
我们从两个方面考虑了这个问题:
让我们首先谈论第一个解决方案是插入一个for循环周期:
此外,第二个解决方案是生成SQL插入:
因此,我们最终必须考虑的是我们在互联网上花费的时间,是否超过了SQL插入时间?这是我们必须考虑的核心问题。
接下来,让我们进行一个简单的测试,并批量插入50,000个数据。
首先准备一个简单的测试表:
接下来,创建一个Spring Boot项目,介绍MyBatis依赖项和MySQL驱动程序,然后在应用程序中配置数据库连接信息。
每个人都需要注意,此数据库中有一个参数RWRITEBATCHEDSTAEMENTS连接URL地址,这是核心。
MySQL JDBC驱动程序默认情况下会忽略该语句,拆卸我们期望的一组句子,然后将它们逐一发送到数据库。批处理插入实际上是一个单个插入,它直接导致较低的性能。将参数设置为数据库驱动程序,以帮助我们分批执行。
好,所以准备工作。
首先,让我们看一下测试1测试,即一个一个一个插入(实际上是批处理处理)。
首先创建相应的映射器,如下:
相应的XML文件如下:
服务如下:
在这里,我想谈论:
尽管这是插入的一部分,但我们必须启动批处理模式(批次),以便您仅使用此SQLSession。如果您不使用批处理过程模式,则会花费大量时间获得连接和释放连接。效率很低,这种低效率方法不会测试Matsushi。
接下来,编写一个简单的测试界面以查看:
编写一个简单的单元测试:
可以看出,需要901毫秒,而5W数据的插入小于1秒。
第二个方案是生成SQL并插入它。
映射器如下:
相应的SQL如下:
服务如下:
然后在单元测试中调整此方法:
您会看到,插入50,000个数据需要1805毫秒。
可以看出,生成SQL的执行效率仍然更糟。
此外,应该注意的是,第二个解决方案中还有另一个问题,也就是说,当数据量较大时,生成的SQL将特别长。MySQL可能一次无法处理如此大的SQL。在此时间之前,处理了插入的数据,这些操作将导致更长的插入时间。
显然,计划更有利。当批量插入100,000或200,000个数据时,计划的优点将更加明显(第二个解决方案需要修改MySQL配置或处理插入数据以进行片段化)。
小朋友知道,实际上,Mybatis Plus中有一种批处理方法。让我们看一下其实施来源:
可以看出,这里的sqlStatement是一个,它是一个一个插入的。
让我们看一下ExecuteBatch方法,如下:
请注意回报的第三个参数,这是lambda表达式,这也是MP中批处理插入的核心逻辑。可以看出,MP首先切成数据(默认的碎片大小为1000)。碎片完成后,也是插入的一部分。如果您继续查看ExecuteBatch方法,您会发现这里的SQLSession实际上是一批SQLSession,而不是普通的SQLSession。
总之,MP中的批处理插入方案实际上与我们2.1部分的批处理插入相同。
好吧,经过上述分析,现在朋友知道该怎么办?
兄弟歌曲提供了测试用例,公共帐户背景对批处理插入测试做出了响应,以获取案例地址。该情况有三种单位测试方法。您可以看到批处理插入之间的时差(数据库脚本在资源目录中)。
有兴趣的朋友可能希望尝试?
最后,再次感谢您的意见?