项目运行慢的原因剖析
背景
打开Chrome浏览器,输入url之后,其他页面显示都正常,但是当打开问题(暂且称为问题url)url的时候,服务器给回的响应特别慢。
剖析原因
前端原因
慢的原因很有可能是js文件或者css文件使用的cdn加速,但是有的cdn加速会特别慢,这就导致了使用cdn服务器的响应回的特别慢,导致浏览器给用户的响应就慢。所以打开F12调试窗口,查看如下:
会发现主要的时间都浪费在index的请求,点击进去会发现一个url延迟特别高。这就排除了前端原因了。
后台原因
找到对应的controller的url,然后发现对应的应该也没问题啊,取表中的数据,
将其拷贝到idea数据库的console进行搜索,
数据都是毫秒级别的,不可能这么慢。那问题到底在哪?
进入debug模式,然后单步执行
查看执行sql的debug模式:
会发现直接执行了应该执行的sql方法,其他下面我确实没写。直到后来,查看我的mapper的xml文件
其中这个BaseResultMap是映射集,他的映射集是这样写的。
<resultMap id="BaseResultMap" type="cn.tj.entity.Application">
....
<result column="app_create_time" property="appCreateTime" jdbcType="DATE"/>
<result column="app_interview_pass" property="appInterviewPass" jdbcType="VARCHAR"/>
<result column="app_interview_time" property="appInterviewTime" jdbcType="DATE"/>
<association property="user" column="user_id" select="cn.tj.mapper.UserMapper.selectByPrimaryKey"/>
</resultMap>
你会想问那为什么会出现TrainMapper的selectByPrimaryKey的sql呢,没错,就是在userMapper里面还有Train的引用。如下图:
<resultMap id="BaseResultMap" type="cn.tj.entity.User" >
<id column="user_id" property="userId" jdbcType="INTEGER" />
...
<result column="user_type" property="userType" jdbcType="VARCHAR" />
<result column="user_apply_status" property="userApplyStatus" jdbcType="VARCHAR" />
<result column="user_train_status" property="userTrainStatus" jdbcType="VARCHAR" />
<association property="trainClass" column="user_highest_tclass_id" select="cn.tj.mapper.TrainClassMapper.selectByPrimaryKey" />
<association property="train" column="user_highest_train_id" select="cn.tj.mapper.TrainMapper.selectByPrimaryKey" />
</resultMap>
这一下子就明白了吧,为什么每次打开这个页面有点慢,就是在mapper的时候,使用了association查询了其他类的sql,所以一下子就慢了。
解决
其实我也不想解决啊。但是没办法。肯定不用BaseResultMap,自己写一个mapper,然后将查询结果直接映射到自己的写的dto里面就行了。