baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.3k stars 4.3k forks source link

我的应用中大概有 700+个 mapper.xml,启动的时候这部分初始化完毕需要耗时 3-4 分钟 #3568

Closed coolbeevip closed 3 years ago

coolbeevip commented 3 years ago

当前使用版本(必填,否则不予处理)

version 3.3.2

MacBookk pro

JVM

-Xmx4g
-Xms4g
-Xss256k
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
-Xnoclassgc
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:ParallelGCThreads=12
-XX:MaxTenuringThreshold=15
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:CMSInitiatingOccupancyFraction=65
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSClassUnloadingEnabled
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10

该问题是如何引起的?(确定最新版也有问题再提!!!)

我的应用中大概有700+个 mapper.xml,启动的时候这部分初始化完毕需要耗时 3-4 分钟,这是否正常,有什么建议的方法可以优化吗?

MybatisConfiguration.addMapper 总体耗时并不多 33 多秒

image

但我的 MappedStatement 数量很多,将近 3 万

image

coolbeevip commented 3 years ago

我发现时间主要消耗在 com.baomidou.mybatisplus.core.injector.AbstractSqlInjector

image

liubinylx commented 3 years ago

用mapper.xml的化还不如不用这个plus,文档一堆垃圾

qmdx commented 3 years ago

表太多,你可以考虑下精简 baseMapper 自定义下,只保留你常用的 api

coolbeevip commented 3 years ago

表太多,你可以考虑下精简 baseMapper 自定义下,只保留你常用的 api

精简后发现效果不是很明显

精简前: 加载 1154 个 Mapper 类,每个类 20 个方法,总耗时 175秒,平均每个 Mapper 耗时 151 毫秒

精简后:加载 1154 个 Mapper 类,每个类 12 个方法,总耗时 164秒,平均每个 Mapper 耗时 142 毫秒

我还是设置 Mapper Lazy 加载吧

coolbeevip commented 3 years ago

另外,我测试了一下,在我本机上

https://github.com/baomidou/mybatis-plus/blob/76657d19e75b5edb317387f27593efa37b40aa56/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractSqlInjector.java#L52

改为 parallel 好像也能有一点提升

methodList.stream().parallel().forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
zhangyanglei commented 1 year ago

@coolbeevip 您这个工具是啥 我最近也在分析启动耗时问题

coolbeevip commented 1 year ago

@coolbeevip 您这个工具是啥 我最近也在分析启动耗时问题

JProfiler

zhangyanglei commented 1 year ago

@coolbeevip 您这个工具是啥 我最近也在分析启动耗时问题

JProfiler

感谢回复 另外问一嘴你这个问题解决了吗 mapper懒加载很麻烦吧 你要把service跟controller都lazy掉才行

coolbeevip commented 1 year ago

@coolbeevip 您这个工具是啥 我最近也在分析启动耗时问题

JProfiler

感谢回复 另外问一嘴你这个问题解决了吗 mapper懒加载很麻烦吧 你要把service跟controller都lazy掉才行

我们还好,因为这部分代码我们是根据一个描述文件自动生成的

rehuhu commented 1 year ago

@coolbeevip 您这个工具是啥 我最近也在分析启动耗时问题

JProfiler

感谢回复 另外问一嘴你这个问题解决了吗 mapper懒加载很麻烦吧 你要把service跟controller都lazy掉才行

请问mapper懒加载你是怎么做的?

frozenfield commented 3 months ago

我猜,你用service了吧,启动慢不是因为mapper加载,而是因为service注入到spring容器。你尝试一下给你的service都@Lazy,看看时间是不是缩短很多。我是直接通过spring的AOP机制把整包给懒加载了,800个mapper,启动很快。