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