今天遇到一个场景,接口在调用的时候耗时 7 秒,然后在分析代码的时候发现 sql 执行只需要 0.5 秒, mybatis 在将结果集转换成对象的过程中耗时 6 秒,如果将返回的对象改成 list<map>那么只需要 2 秒,我一次返回的数据量大概在 10 万左右
看了一下源码一个对象需要根据具体查询的字段数量去 for 循环,这样下来一个对象 10 个字段,获取 10 万的数据大概就需要循环 100 万次,这效率也太差了,大家有什么更好的办法吗?
我想知道如何优化 mybatis 的对象转换过程,不要说多线程查询,限制 sql 之类的
1
shadowyue 17 小时 53 分钟前
应该是 new 返回的数据对象花了太多时间吧
|
2
visper 17 小时 50 分钟前
猜测,像这种 orm 转换成对象的话,都在使用反射。一个个字段对。这样的话如果你知道了数据是怎样的,想极限优化的话,也不用先查出 list<map>什么的,直接自己查出 resultSet 然后一个个读出来,new 自己的对象一个个字段 set 进去。
|
3
WashFreshFresh 17 小时 27 分钟前
没得优化,我遇到过好多次了,如果返回 map 快的话,你可以试试用 parallelStream 遍历 list<map>转对象 list 。
|
4
prosgtsr 2 小时 15 分钟前 via iPhone
jpa 上遇过这个问题,接口注解里用构造方法会快很多,或者用 list<object>接收也快很多。mybatis 慢的话应该也是同理,用 list map 接收然后自己转吧
|