今天遇到一个场景,接口在调用的时候耗时 7 秒,然后在分析代码的时候发现 sql 执行只需要 0.5 秒, mybatis 在将结果集转换成对象的过程中耗时 6 秒,如果将返回的对象改成 list<map>那么只需要 2 秒,我一次返回的数据量大概在 10 万左右
看了一下源码一个对象需要根据具体查询的字段数量去 for 循环,这样下来一个对象 10 个字段,获取 10 万的数据大概就需要循环 100 万次,这效率也太差了,大家有什么更好的办法吗?
我想知道如何优化 mybatis 的对象转换过程,不要说多线程查询,限制 sql 之类的
1
shadowyue 3 天前
应该是 new 返回的数据对象花了太多时间吧
|
2
visper 3 天前
猜测,像这种 orm 转换成对象的话,都在使用反射。一个个字段对。这样的话如果你知道了数据是怎样的,想极限优化的话,也不用先查出 list<map>什么的,直接自己查出 resultSet 然后一个个读出来,new 自己的对象一个个字段 set 进去。
|
3
WashFreshFresh 3 天前
没得优化,我遇到过好多次了,如果返回 map 快的话,你可以试试用 parallelStream 遍历 list<map>转对象 list 。
|
4
prosgtsr 2 天前 via iPhone
jpa 上遇过这个问题,接口注解里用构造方法会快很多,或者用 list<object>接收也快很多。mybatis 慢的话应该也是同理,用 list map 接收然后自己转吧
|
5
iv8d 1 天前
用 list<map> ,自行读取
|
6
siweipancc 1 天前 via iPhone
仿一下 spring jpa ,楼上说的,改造成 xml ,返回构造函数,前提是不会有修改动作
|
7
xiangyuecn 1 天前
这个优化有点多余,就算是执行 10 分钟也大概率不需要任何优化
|
8
zzmark06 19 小时 56 分钟前
返回 10w ,零散对象就是多。
在任何有必要优化的专门点位,使用原生 JDBC API 来针对性优化,是完全正确且合乎情理的。 所以,遇到此类问题别和框架死磕,直接动用更底层的原始 API 就好。 |