需求
系统查询时发现某个页面查询速度非常慢,优化查询效率。
思路
首先想到是否时sql查询问题,索引是否添加且生效。
当sql没有问题时,查看是否是因为代码大量循环请求数据库导致接口速度缓慢。
问题定位
- 首先,使用
EXPLAIN
对代码中的查询语句进行速度检测,结果显示SQL查询均正常使用了索引。 - 对代码中的循环语句进行检查,发现循环中访问数据库的操作并不多。
- 最终,通过使用debug进行问题定位,发现某行代码未能正常传递查询条件,导致SQL语句执行了全表扫描。
问题分析
在Java中,HashMap
的put
方法返回的是与指定键关联的先前值。如果键之前没有任何值关联,则返回null
。因此,当这样使用put
方法时:
List<Map> list = (List<Map>) dao.findForList("Mapper.select",new HashMap<>().put("code", map.get("code")));
这个表达式的实际效果是:
- 创建一个新的
HashMap
对象。 - 调用
put
方法,将键值对("code", map.get("code"))
插入到该HashMap
中。 put
方法返回先前与键"code"
关联的值。在这种情况下,由于这是一个新的HashMap
,所以返回null
。
因为put
方法返回的是先前的值,而不是HashMap
本身,你实际上是将null
传递给了dao.findForList
方法。
为了正确地创建并传递包含键值对的HashMap
对象,应该分开这两个步骤:首先创建HashMap
对象,然后向其中添加键值对。以下是修正后的代码:
// 创建一个HashMap对象
Map<String, Object> map= new HashMap<>();
// 向HashMap对象中添加键值对
map.put("code", map.get("code"));
// 将HashMap对象传递给dao.findForList方法
List<Map> inspectionorderList = (List<Map>) dao.findForList("Mapper.select", map);
通过这种方式,可以确保map
对象包含了所需的键值对,并且能够正确传递给dao.findForList
方法。