V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jwh199588
V2EX  ›  程序员

mybatis 结果集太多导致转换对象太慢

  •  
  •   jwh199588 · 3 天前 · 1309 次点击

    今天遇到一个场景,接口在调用的时候耗时 7 秒,然后在分析代码的时候发现 sql 执行只需要 0.5 秒, mybatis 在将结果集转换成对象的过程中耗时 6 秒,如果将返回的对象改成 list<map>那么只需要 2 秒,我一次返回的数据量大概在 10 万左右

    看了一下源码一个对象需要根据具体查询的字段数量去 for 循环,这样下来一个对象 10 个字段,获取 10 万的数据大概就需要循环 100 万次,这效率也太差了,大家有什么更好的办法吗?

    我想知道如何优化 mybatis 的对象转换过程,不要说多线程查询,限制 sql 之类的

    8 条回复    2025-01-27 03:00:56 +08:00
    shadowyue
        1
    shadowyue  
       3 天前
    应该是 new 返回的数据对象花了太多时间吧
    visper
        2
    visper  
       3 天前
    猜测,像这种 orm 转换成对象的话,都在使用反射。一个个字段对。这样的话如果你知道了数据是怎样的,想极限优化的话,也不用先查出 list<map>什么的,直接自己查出 resultSet 然后一个个读出来,new 自己的对象一个个字段 set 进去。
    WashFreshFresh
        3
    WashFreshFresh  
       3 天前
    没得优化,我遇到过好多次了,如果返回 map 快的话,你可以试试用 parallelStream 遍历 list<map>转对象 list 。
    prosgtsr
        4
    prosgtsr  
       2 天前 via iPhone
    jpa 上遇过这个问题,接口注解里用构造方法会快很多,或者用 list<object>接收也快很多。mybatis 慢的话应该也是同理,用 list map 接收然后自己转吧
    iv8d
        5
    iv8d  
       1 天前
    用 list<map> ,自行读取
    siweipancc
        6
    siweipancc  
       1 天前 via iPhone
    仿一下 spring jpa ,楼上说的,改造成 xml ,返回构造函数,前提是不会有修改动作
    xiangyuecn
        7
    xiangyuecn  
       1 天前
    这个优化有点多余,就算是执行 10 分钟也大概率不需要任何优化
    zzmark06
        8
    zzmark06  
       19 小时 56 分钟前
    返回 10w ,零散对象就是多。
    在任何有必要优化的专门点位,使用原生 JDBC API 来针对性优化,是完全正确且合乎情理的。
    所以,遇到此类问题别和框架死磕,直接动用更底层的原始 API 就好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2066 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 14:57 · PVG 22:57 · LAX 06:57 · JFK 09:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.