网站首页 > 精选教程 正文
之前一个数据校验功能遇到严重性能瓶颈
插入数据居然需要22秒,优化后0.38秒
一个联合join校验需要42秒,优化后1.87秒
一个增删改对比显示union的sql需要49秒,优化后1.023秒
1、首先是batch的问题:
在本项目中,使用了org.springframework.jdbc.core.JdbcTemplate类作为数据库链接服务。批量插入时,调用jdbcTemplate.batchUpdate方法进行批量插入,然而插入速度不尽如人意,非常缓慢。问题点在于,明明使用了batchUpdate而不是逐条插入,为何会出现插入缓慢的问题呢?
原来在链接MySQL的时候,并没有设置自动合并多个insert的功能,导致还是变成了逐条插入。正确的方式是,修改MySQL链接参数,添加关键字段rewriteBatchedStatements=true,详细如下:
jdbc:mysql://test_host:3306/test_schemas1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&rewriteBatchedStatements=true
添加这个rewriteBatchedStatements参数设置后,batch插入从原来的22秒变成了0.38秒,速度提升明显。
2、接着是一个联合join的校验问题。
项目需求一个3表join,以左表为基准,进行2次连续的left join且附带筛选条件。调优前运行缓慢,需要44秒。
原先采用一条sql解决所有问题,后改为首先用3条sql将3个表的最新记录筛选下来,再用Map<String, List<String> >数据结构记录key和重复的项,遍历进行java式的join,由于全部运算基于hashmap且在内存中运行,速度非常快
调优后速度变为1.87秒
3、最后是个增删改对比显示的sql问题
这段SQL的原来思路是先left join,右表为null的就是相对右表新增的;再inner join,把对比修改的字段都判断一遍,不全相等的就是左表相对右表更改的;最后再right join,把左表为null的筛出来,说明这是左表相对右表删除的。最后最后,把3个查出来的结果再union起来。整个查询时间非常漫长,需要49秒。
优化后的代码,将左表和右表分别用DAO载下来,然后通过HashMap来进行对比,大致代码如下:
Map<String, String[]> mapA = dbData; Map<String, String[]> mapB = upload; Map<String, String[]> mapBadd = new HashMap<String, String[]>(mapB); Map<String, String[]> mapBdel = new HashMap<String, String[]>(); Map<String, String[]> mapBchange = new HashMap<String, String[]>(); Iterator<String> it = mapA.keySet().iterator();while (it.hasNext()) { String key = it.next(); String[] val = mapA.get(key); if (mapB.containsKey(key)) { String[] bVal = mapB.get(key); if (val != null && val.equals(bVal) || Arrays.equals(val, bVal)) { } else { String[] changeVal = new String[val.length + bVal.length]; System.arraycopy(val, 0, changeVal, 0, val.length); System.arraycopy(bVal, 0, changeVal, val.length, bVal.length); mapBchange.put(key, changeVal); } mapBadd.remove(key); } else { // A里面有的,B没有的 mapBdel.put(key, val); } }
优化后仅需要1.023秒,非常快。
猜你喜欢
- 2024-10-29 Java中最简单的连接Oracle数据库和Mysql数据库的方式
- 2024-10-29 Java | MySQL 分布函数、前后函数你认识吗?
- 2024-10-29 Javaweb知识 day02 mysql数据库 javaweb程序设计任务教程黑马程序员电子版
- 2024-10-29 Jenkins Pipeline 连接 MySQL 数据库
- 2024-10-29 银四将近,Java程序员临时抱佛脚也要啃下的硬骨头——MySQL
- 2024-10-29 Java代码中,如何监控Mysql的binlog?
- 2024-10-29 Java环境+Mysql+Tomcat部署JavaWeb项目到云服务器(十分详细)
- 2024-10-29 mysql-connector-java与MySQL 8.X版本建立连接
- 2024-10-29 java连接mysql数据库达成数据查询详细教程
- 2024-10-29 Java代码操作MySQL java操作mysql语法
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)