这是个基本常识额,在这里再赘述一下。
例如一个大sql查出100条结果,现在每条记录要关联显示一条其他数据。该怎样做?
for循环中使用sql语句
最简单的一种方式就是for循环中使用sql语句。根据关联字段查出对应的数据。
优点:
实现简单快速,在2个表都有基本Mapper的情况下,不用新增任何基础类,直接可以拼凑逻辑。
缺点:
整个接口速度慢,例如list有100条结果,每条都遍历查库,需要查100次库。
而建立session访问数据库是较耗时的操作,最简单的一个session也要20ms左右。
光和数据库交互就要2秒,更何况还有其他逻辑。
大量查询拉低数据库性能, 数据库的连接数是有限的,因为有限,所以珍贵。
即使配置了连接池,有效的提高了和数据库交互的效率。 仍应避免大量频繁查询。
for循环中使用sql语句,有个明显的现象是第一次查询速度很快,越查询越慢。
这是个很反常的现象,因为oracle有缓存的机制,按道理说该第一次查询慢,越查询越快。
那么为什么会出现这种情况呢?
是因为每次这种for循环查询,会大量请求数据库,造成通道拥堵。所以越查越慢。
一个大sql实现功能
上面说了,for循环sql语句效率太低。
那么该怎么办呢?
一个大sql实现功能。
优点:
如果功能确定,且不轻易修改。这种方式是很好的,因为高度定制,可以尽可能的优化sql语句。往往可以写出性能很好的sql语句。
缺点:
如果该sql频繁需要扩展,高度定制的方式就不太适合。每次扩展,都要进行调整。不但工作量大,而且容易出错。一不小心,辛辛苦苦优化的sql就变成木柴了。
2个for循环用java遍历
如果语句好调整,一条sql出结果最好。
实在不行的话,也可以用foreach标签,将关联表的数据查为一个list。
哪怕在java中有2个for循环呢,效率也比直接for循环sql查库好。
因为查出2个list,用2次sqlSession即可,是绝对比for循环调用n次好。
用sql搞崩一个项目
不用什么大sql,直接来个10000次的for循环。 每个循环里面一个sql就行,数据库基本就崩了。