当前位置: 首页 > wzjs >正文

北京网站平台建设公司建设教育培训的网站

北京网站平台建设公司,建设教育培训的网站,网站会员系统功能,品牌设计公司宣传画册一.批量新增IService为我们提供了批量新增的方法,saveBatch方法用来将一个集合中的值进行批量插入。下面我们就来探究一下它相对于普通的逐条新增效果能提升多少。首先我们来看逐条新增:private User buildUser(int i) {User user new User();user.setU…

一.批量新增

IService为我们提供了批量新增的方法,saveBatch方法用来将一个集合中的值进行批量插入。下面我们就来探究一下它相对于普通的逐条新增效果能提升多少。

首先我们来看逐条新增:

private User buildUser(int i) {User user = new User();user.setUsername("user_" + i);user.setPassword("123");user.setPhone("" + (18688190000L + i));user.setBalance(2000);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(user.getCreateTime());return user;
}

我们准备一段代码,该段代码用来创建一个user对象。

下面我们调用这段代码,将100000条数据加入到数据库中。

@Test
void testSaveOneByOne() {long b = System.currentTimeMillis();for (int i = 1; i <= 100000; i++) {userService.save(buildUser(i));}long e = System.currentTimeMillis();System.out.println("耗时:" + (e - b));
}

查看用时,我们发现共计用时233925ms。

为什么花费了这么长时间?因为每次执行save方法都会执行一次insert语句(insert into ... (... , ... , ...) values (? , ?, ? ,? ..., ?))。并且会访问一次数据库,每次访问数据库都是一次请求,因此会导致大量访问数据库造成性能降低。

接着再看批量新增

@Test
void testSaveBatch() {// 准备10万条数据List<User> list = new ArrayList<>(1000);long b = System.currentTimeMillis();for (int i = 1; i <= 100000; i++) {list.add(buildUser(i));// 每1000条批量插入一次if (i % 1000 == 0) {userService.saveBatch(list);list.clear();}}long e = System.currentTimeMillis();System.out.println("耗时:" + (e - b));
}

提升了将近10倍。为什么呢?因为MybatisPlus的批处理是基于PrepareStatement的预编译模式,然后批量提交,最终在数据库执行时还是会有多条insert语句,逐条插入数据。SQL类似这样:

Preparing: INSERT INTO user ( username, password, phone, info, balance, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
Parameters: user_1, 123, 18688190001, "", 2000, 2023-07-01, 2023-07-01
Parameters: user_2, 123, 18688190002, "", 2000, 2023-07-01, 2023-07-01
Parameters: user_3, 123, 18688190003, "", 2000, 2023-07-01, 2023-07-01

也就是说MybatisPlus减少了访问数据库请求的次数,由原来的100000次变为了100次。但是仍然是执行了多条SQL语句。有没有一种办法使其能够执行1条SQL语句就完成100000条内容的插入呢?

答案是有,我们只要能构造这样的SQL语句,就能完成。

INSERT INTO user ( username, password, phone, info, balance, create_time, update_time )
VALUES 
(user_1, 123, 18688190001, "", 2000, 2023-07-01, 2023-07-01),
(user_2, 123, 18688190002, "", 2000, 2023-07-01, 2023-07-01),
(user_3, 123, 18688190003, "", 2000, 2023-07-01, 2023-07-01),
(user_4, 123, 18688190004, "", 2000, 2023-07-01, 2023-07-01);

该怎么做呢?

MySQL的客户端连接参数中有这样的一个参数:rewriteBatchedStatements。顾名思义,就是重写批处理的statement语句。参考文档:

https://dev.mysql.com/doc/connector-j/en/connector-j-connp-props-performance-extensions.html

这个参数的默认值是false,我们需要修改连接参数,将其配置为true。修改项目中的application.yml文件,在jdbc的url后面添加参数&rewriteBatchedStatements=true:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=truedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: MySQL123

再次测试插入10万条数据,可以发现速度有非常明显的提升:

原理如下:

ClientPreparedStatementexecuteBatchInternal中,有判断rewriteBatchedStatements值是否为true并重写SQL的功能:

最终,SQL被重写了:

重写成了我们希望的样子,这样就能实现一次SQL执行,一次访问。


文章转载自:

http://tmfNxa8J.bsghk.cn
http://MG3HoYpP.bsghk.cn
http://I87ZuMeN.bsghk.cn
http://Q7xIpOoV.bsghk.cn
http://mIkQsuP9.bsghk.cn
http://oT6lRsl4.bsghk.cn
http://Jr2ImwZg.bsghk.cn
http://R9boy8G3.bsghk.cn
http://cRukR022.bsghk.cn
http://jqMs6jsK.bsghk.cn
http://fRgH8cfb.bsghk.cn
http://KWglijS2.bsghk.cn
http://L695HXlH.bsghk.cn
http://SrwdxnZ5.bsghk.cn
http://gKNJmvww.bsghk.cn
http://fB8hKjxh.bsghk.cn
http://ib0oG5Vh.bsghk.cn
http://iT2aPpA6.bsghk.cn
http://tePfEZJk.bsghk.cn
http://F35fTPq2.bsghk.cn
http://DIprWc8J.bsghk.cn
http://Uqd5WbPd.bsghk.cn
http://t8Gtsnjn.bsghk.cn
http://0TGlSxQm.bsghk.cn
http://B0EFtUPq.bsghk.cn
http://hdUympl5.bsghk.cn
http://u3Aoyt1f.bsghk.cn
http://N8c4dMzV.bsghk.cn
http://k2zLNTFx.bsghk.cn
http://8KTvHUni.bsghk.cn
http://www.dtcms.com/wzjs/714310.html

相关文章:

  • 开发网站的流程步骤网站建设需要这些工具和软件
  • 做网站是怎么赢利的计算机网站开发就业形势
  • 08r2 搭建php网站v2ex 网站建设
  • 图库网站建设金堂县城乡建设局网站
  • 自助建站的优点与缺点网站开发有哪几种语言
  • 自己的网站网站后缀co
  • 篮球网站建设目标企业形象vi设计案例分析
  • 丽水网站seo建设银行培训网站
  • 网站对应的ip地址吗qq云端服务器
  • dede 汽车网站模板有没有像一起做网店做男装的网站
  • 网站上面的水印怎么做企业建站公司怎么创业
  • 泉州微信网站开发公司北京所有公司名单
  • 受欢迎的网站建设平台杭州网站建设派迪网络
  • php网站目录系统工业和信息化部发短信什么意思
  • 网站如何提高权重专业制作存单
  • wordpress关于本站北京市住房和城乡建设部网站
  • 和客户谈建网站怎么说长春做网站
  • 文网站建设服务费记入什么科目广州昨天发生重大新闻
  • 紫川网站建设wordpress系统教程 pdf
  • 手表常用网站域名
  • 没有网站可以做落地页wordpress阿里云储存
  • 合肥关键词网站排名在pc端预览手机网站
  • php购物网站设计代码网站单页制作教程
  • 阿里云 多域名解析 到不同的网站如何加强精神文明网站建设内容
  • 湖北商城网站建设多少钱淘宝客优惠券网站建设教程视频
  • 西安网站制作服务商个人房产查询系统网站官网
  • 淘宝网站建设维护会计科目网站索引量下降
  • 福州哪里会网站制作的常州互联网公司
  • 广东官网网站建设哪家好在线代理服务器网站
  • 网站开发好学上海营销型网站设计