在一次日常查询中,涉及到需要根据条件查询postgresql获取数据的流程,查询工具为jpa / jdbcTemplate, 在查询过程中发现很简单的一条sql 查询需要耗时接近50秒,而总数据量仅仅为1800 多条,且查询条件已经设置了索引(其实数据量小的情况下,索引效果不明显)。
首先怀疑是否是sql本身的问题,但是单独把sql拿出来放到数据库控制台查询的话,发现速度很快,秒级就可以响应。但是最终为了验证,还是决定把关联查询分为多个表个字查询,然后合并结果,但是实际发现,每次查询到主表(主表数据1800+)的时候,查询速度就特别慢,接近30秒的时间响应。为了验证具体耗时步骤,开始追踪源码。
如图所示为jdbcTemplate 查询和处理数据的核心代码,其中 stmt.executeQuery(sql) 表示执行查询的动作, rse.extractData(rs) 表示将查询得到的resultSet中的数据转化到具体的接收对象中,转化过程主要通过RowMapper.mapRow 来实现。
mapRow 的主要逻辑是通过反射创建一个对象,然后将绑定resultSet中的每一行row 数据绑定来返回(如BeanPropertyRowMapper&