PageSourceSearch

https://susan.net.cn/assets/12-spring-boot-performance-optimizations.html-qigq9a1B.js

js susan.net.cn collected 2026-10-08 05:01:46 UTC 69,291 bytes, 128 lines download raw bytes

1import{_ as i,c as a,b as n,o as l}from"./app-BX6j4ZW7.js";const e={};function h(t,s){return l(),a("div",null,[...s[0]||(s[0]=[n(`<h2 id="前言" tabindex="-1"><a class="header-anchor" href="#前言"><span>前言</span></a></h2><div class="article-referral-ad"><p>最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad1" rel="nofollow">这个链接</a>(或许真的能够帮到你)。</p></div><p>不知道你在SpringBoot项目中,有没有遇到过下面这样的代码:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">GetMapping</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;/orders&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
2<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> List</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&lt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">Order</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> listOrders</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">() {</span></span>
3<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">findAll</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
4<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一次性查询了所有的订单,全表扫描50万数据,导致接口查询性能很差,严重的时候可能会导致OOM问题。</p><p><strong>问题定位</strong>:</p><ul><li>未分页查询</li><li>无缓存机制</li><li>未启用批量处理</li></ul><p>这次事故让我明白:<strong>性能优化必须贯穿开发全流程</strong>。</p><p>今天这篇文章,跟大家一起聊聊SpringBoot优化的12招,希望对你会有所帮助。</p><p><img src="https://files.mdnice.com/user/5303/f9081770-66e4-4c3d-93a9-adb099d364aa.png" alt=""></p><p><img src="https://files.mdnice.com/user/5303/709386c3-f34e-4037-8b8e-64b3627e3d0a.png" alt=""></p><h2 id="第1招-连接池参数调优" tabindex="-1"><a class="header-anchor" href="#第1招-连接池参数调优"><span>第1招:连接池参数调优</span></a></h2><p><strong>问题场景</strong>:<br> 默认配置导致连接池资源浪费,高并发时出现连接等待</p><p><strong>错误配置</strong>:</p><div class="language-plain line-numbers-mode" data-highlighter="shiki" data-ext="plain" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-plain"><span class="line"><span>spring:</span></span>
5<span class="line"><span>  datasource:</span></span>
6<span class="line"><span>    hikari:</span></span>
7<span class="line"><span>      maximum-pool-size: 1000 </span></span>
8<span class="line"><span>      connection-timeout: 30000</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>数据库连接池的最大连接数,盲目设置过大,连接超时时间设置过长。</p><p><strong>优化方案</strong>:</p><div class="language-plain line-numbers-mode" data-highlighter="shiki" data-ext="plain" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-plain"><span class="line"><span>spring:</span></span>
9<span class="line"><span>  datasource:</span></span>
10<span class="line"><span>    hikari:</span></span>
11<span class="line"><span>      maximum-pool-size: \${CPU核心数*2} # 动态调整</span></span>
12<span class="line"><span>      minimum-idle: 5</span></span>
13<span class="line"><span>      connection-timeout: 3000 # 3秒超时</span></span>
14<span class="line"><span>      max-lifetime: 1800000 # 30分钟</span></span>
15<span class="line"><span>      idle-timeout: 600000 # 10分钟空闲释放</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>数据库连接池的最大连接数,改成根据CPU核心数动态调整。</p><p>将连接超时时间由30000,改成3000。</p><h2 id="第2招-jvm内存优化" tabindex="-1"><a class="header-anchor" href="#第2招-jvm内存优化"><span>第2招:JVM内存优化</span></a></h2><p><strong>问题场景</strong>:<br> 频繁Full GC导致服务卡顿</p><p>我们需要优化JVM参数。</p><p><strong>启动参数优化</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">java </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">jar </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">Xms4g </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Xmx4g</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
16<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">XX</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">NewRatio</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
17<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">XX</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">:</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">UseG1GC</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
18<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">XX</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">MaxGCPauseMillis</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">200</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
19<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">XX</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">InitiatingHeapOccupancyPercent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">35</span></span>
20<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">XX</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">:</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">AlwaysPreTouch</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>最大堆内存和初始堆内存都设置成了4G。</p><p>
20-XX:NewRatio=1,设置新生代和老年代各占一半。</p><p>垃圾收集器配置的是G1。</p><p>垃圾回收的最大停顿时间为200毫秒。</p><h2 id="第3招-关闭无用组件" tabindex="-1"><a class="header-anchor" href="#第3招-关闭无用组件"><span>第3招:关闭无用组件</span></a></h2><p><strong>问题场景</strong>:<br> 自动装配加载不需要的Bean</p><p><strong>优化方案</strong>:</p><div class="language-plain line-numbers-mode" data-highlighter="shiki" data-ext="plain" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-plain"><span class="line"><span>@SpringBootApplication(exclude = {</span></span>
21<span class="line"><span>    DataSourceAutoConfiguration.class,</span></span>
22<span class="line"><span>    SecurityAutoConfiguration.class</span></span>
23<span class="line"><span>})</span></span>
24<span class="line"><span>public class Application {</span></span>
25<span class="line"><span>    public static void main(String[] args) {</span></span>
26<span class="line"><span>        SpringApplication.run(Application.class, args);</span></span>
27<span class="line"><span>    }</span></span>
28<span class="line"><span>}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果有些功能暂时用不到,可以先排除一下。</p><p>在SpringBoot项目启动的时候,排除了DataSourceAutoConfiguration和SecurityAutoConfiguration配置类的自动装载。</p><h2 id="第4招-响应压缩配置" tabindex="-1"><a class="header-anchor" href="#第4招-响应压缩配置"><span>第4招:响应压缩配置</span></a></h2><p><strong>问题场景</strong>:<br> 接口返回JSON数据体积过大</p><p><strong>优化方案</strong>:</p><div class="language-yml line-numbers-mode" data-highlighter="shiki" data-ext="yml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-yml"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">server</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
29<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">  compression</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
30<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">    enabled</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">true</span></span>
31<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">    mime-types</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">text/html,text/xml,text/plain,text/css,text/javascript,application/json</span></span>
32<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">    min-response-size</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1024</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>配置开启响应的压缩。</p><h2 id="第5招-请求参数校验" tabindex="-1"><a class="header-anchor" href="#第5招-请求参数校验"><span>第5招:请求参数校验</span></a></h2><p><strong>问题场景</strong>:<br> 恶意请求导致资源耗尽</p><p><strong>防御代码</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">GetMapping</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;/products&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
33<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> PageResult</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&lt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">Product</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> list</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span></span>
34<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RequestParam</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Max</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">value</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">100</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;页大小不能超过100&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> pageSize</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
35<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RequestParam</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Min</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> pageNum) {</span></span>
36<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">    //...</span></span>
37<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>
37在接口中做好参数校验,可以拦截很多恶意请求。</p><h2 id="第6招-异步处理机制" tabindex="-1"><a class="header-anchor" href="#第6招-异步处理机制"><span>第6招:异步处理机制</span></a></h2><p><strong>问题场景</strong>:<br> 同步处理导致线程阻塞</p><p><strong>优化方案</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Async</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;taskExecutor&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
38<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> CompletableFuture</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&lt;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">List</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&lt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">Order</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;&gt;</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> asyncProcess</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">() {</span></span>
39<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> CompletableFuture</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">completedFuture</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">heavyProcess</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span>
40<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span>
41<span class="line"></span>
42<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Bean</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;taskExecutor&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
43<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Executor</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> taskExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">() {</span></span>
44<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">    ThreadPoolTaskExecutor</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> executor </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> ThreadPoolTaskExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span>
45<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">    executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setCorePoolSize</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span>
46<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">    executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setMaxPoolSize</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span>
47<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">    executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setQueueCapacity</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">500</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span>
48<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span>
49<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在有些业务逻辑中,使用异步处理性能可能会更好。</p><h2 id="第7招-使用缓存" tabindex="-1"><a class="header-anchor" href="#第7招-使用缓存"><span>第7招:使用缓存</span></a></h2><p>使用缓存可以提升效率。</p><p><strong>缓存架构</strong>:</p><p><img src="https://files.mdnice.com/user/5303/cfb5177c-5ea0-41d5-be16-cf6eca8766ce.png" alt=""></p><p><strong>代码实现</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Cacheable</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">cacheNames</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;products&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> key</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;#id&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
50<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">           cacheManager</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;caffeineCacheManager&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
51<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Product</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> getDetail</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Long</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> id) {</span></span>
52<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> productDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getById</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(id);</span></span>
53<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里使用了内存缓存。</p><h2 id="第8招-批量操作优化" tabindex="-1"><a class="header-anchor" href="#第8招-批量操作优化"><span>第8招:批量操作优化</span></a></h2><p><strong>问题场景</strong>:<br>
53 逐条插入导致性能低下</p><p><strong>优化方案</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Transactional</span></span>
54<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> batchInsert</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">List</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&lt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">Product</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> products) {</span></span>
55<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">    jdbcTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">batchUpdate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span>
56<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">        &quot;INSERT INTO product(name,price) VALUES(?,?)&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
57<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">        products,</span></span>
58<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">        500</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 每批数量</span></span>
59<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">        (ps, product) </span><span style="--shiki-light:#C18401;--shiki-dark:#C678DD;">-&gt;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span>
60<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">            ps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setString</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">product</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span>
61<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">            ps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setBigDecimal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">product</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getPrice</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span>
62<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">        });</span></span>
63<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>每500条数据插入一次数据库。</p><h2 id="第9招-索引深度优化" tabindex="-1"><a class="header-anchor" href="#第9招-索引深度优化"><span>第9招:索引深度优化</span></a></h2><p><strong>问题场景</strong>:<br> 慢查询日志频繁出现全表扫描,SQL执行时间波动大</p><div class="article-referral-ad"><p>最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad2" rel="nofollow">这个链接</a>(或许真的能够帮到你)。</p></div><p><strong>错误案例</strong>:</p><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">-- 商品表结构</span></span>
64<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">CREATE</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> TABLE</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> products</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span></span>
65<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    id </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">BIGINT</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> PRIMARY KEY</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
66<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    name</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> VARCHAR</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">200</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">),</span></span>
67<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    category </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">VARCHAR</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">50</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">),</span></span>
68<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    price </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">DECIMAL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">),</span></span>
69<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    create_time </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">DATETIME</span></span>
70<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span>
71<span class="line"></span>
72<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">-- 低效查询</span></span>
73<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">SELECT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> * </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">FROM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> products </span></span>
74<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">WHERE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> category </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &#39;手机&#39;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
75<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">AND</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> price </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 5000</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
76<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">ORDER BY</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> create_time </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">DESC</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>问题分析</strong>:</p><p><img src="https://files.mdnice.com/user/5303/e5692dec-6dd6-4abd-b76a-958d12a62713.png" alt=""></p><h3 id="优化方案一-联合索引设计" tabindex="-1"><a class="header-anchor" href="#优化方案一-联合索引设计"><span>优化方案一:联合索引设计</span></a></h3><p><strong>索引创建</strong>:</p><p>下面创建了一个分类ID,单价和时间的联合索引:</p><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">ALTER</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> TABLE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> products </span></span>
77<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">ADD</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> INDEX</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> idx_category_price_create </span></span>
78<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(category, price, create_time);</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="优化方案二-覆盖索引优化" tabindex="-1"><a class="header-anchor" href="#优化方案二-覆盖索引优化"><span>优化方案二:覆盖索引优化</span></a></h3><p><strong>查询改造</strong>:</p><p>只查询索引包含字段:</p><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">SELECT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> id, category, price, create_time </span></span>
79<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">FROM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> products </span></span>
80<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">WHERE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> category </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &#39;手机&#39;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
81<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">AND</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> price </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">&gt;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 5000</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
82<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">ORDER BY</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> create_time </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">DESC</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里使用了覆盖索引。</p><h3 id="优化方案三-索引失效预防" tabindex="-1"><a class="header-anchor" href="#优化方案三-索引失效预防"><span>优化方案三:索引失效预防</span></a></h3><p><strong>常见失效场景</strong>:</p><p><img src="https://files.mdnice.com/user/5303/b8482c5a-131d-4df0-aabe-9001af58209f.png" alt=""></p><p><strong>案例修复</strong>:</p><p>错误写法:</p><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">SELECT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> * </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">FROM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> products </span></span>
83<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">WHERE</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> DATE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(create_time) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &#39;2023-01-01&#39;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>正确写法:</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-"><span class="line"><span>SELECT * FROM products </span></span>
84<span class="line"><span>WHERE create_time BETWEEN &#39;2023-01-01 00:00:00&#39; </span></span>
85<span class="line"><span>AND &#39;2023-01-01 23:59:59&#39;;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>查询时间范围,这里使用了BETWEEN AND关键字,代替了等于号。</p><h3 id="优化方案四-索引监控分析" tabindex="-1"><a class="header-anchor" href="#优化方案四-索引监控分析"><span>优化方案四:索引监控分析</span></a></h3><p><strong>诊断命令</strong>:</p><p>查看ç
85´¢å¼•使用情况:</p><div class="language-sql line-numbers-mode" data-highlighter="shiki" data-ext="sql" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-sql"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">SELECT</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
86<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    index_name,</span></span>
87<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    rows_read,</span></span>
88<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    rows_selected </span></span>
89<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">FROM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
90<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">    sys</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">schema_index_statistics</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
91<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">WHERE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span>
92<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">    table_name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &#39;products&#39;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>分析索引效率:</p><div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-"><span class="line"><span>EXPLAIN FORMAT=JSON </span></span>
93<span class="line"><span>SELECT ...;</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="索引优化黄金三原则" tabindex="-1"><a class="header-anchor" href="#索引优化黄金三原则"><span>索引优化黄金三原则</span></a></h3><ol><li><strong>最左前缀原则</strong>:联合索引的第一个字段必须出现在查询条件中</li><li><strong>短索引原则</strong>:整型字段优先,字符串字段使用前缀索引</li><li><strong>适度索引原则</strong>:单个表索引数量不超过5个,总索引长度不超过表数据量30%</li></ol><p><strong>DBA工具箱</strong></p><ul><li>索引分析脚本</li><li>执行计划可视化工具</li><li>索引碎片检测工具</li></ul><h2 id="第10招-自定义线程池" tabindex="-1"><a class="header-anchor" href="#第10招-自定义线程池"><span>第10招:自定义线程池</span></a></h2><p><strong>问题场景</strong>:<br> 默认线程池导致资源竞争</p><p><strong>优化方案</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Bean</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;customPool&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
94<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Executor</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> customThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">() {</span></span>
95<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> ThreadPoolExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span></span>
96<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">        10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 核心线程</span></span>
97<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">        50</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 最大线程</span></span>
98<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">        60</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> TimeUnit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">SECONDS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
99<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">        new</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> LinkedBlockingQueue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">&lt;&gt;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1000</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
100<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">        new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> CustomThreadFactory</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
101<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">        new</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> ThreadPoolExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">CallerRunsPolicy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span>
102<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在高并发业务场景中,使用Executors类创建默认的线程池,可能会导致OOM问题。</p><p>因此,我们需要自定义线程池。</p><h2 id="第11招-熔断限流策略" tabindex="-1"><a class="header-anchor" href="#第11招-熔断限流策略"><span>第11招:熔断限流策略</span></a></h2><p><strong>问题场景</strong>:<br>
102 突发流量导致服务雪崩</p><p><strong>解决方案</strong>:</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 使用Sentinel实现接口限流</span></span>
103<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">SentinelResource</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">value</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;orderQuery&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span>
104<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">                  blockHandler</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;handleBlock&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span>
105<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">                  fallback</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> &quot;handleFallback&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
106<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">GetMapping</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;/orders/{id}&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span>
107<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> getOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">PathVariable</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Long</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> id) {</span></span>
108<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getById</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(id);</span></span>
109<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span>
110<span class="line"></span>
111<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 限流处理</span></span>
112<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> handleBlock</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Long</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> BlockException</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> ex) {</span></span>
113<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    throw</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> RuntimeException</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;服务繁忙,请稍后重试&quot;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span>
114<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span>
115<span class="line"></span>
116<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 降级处理</span></span>
117<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> handleFallback</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Long</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Throwable</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> t) {</span></span>
118<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getDefaultOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span>
119<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>为了解决重复流量导致服务雪崩的问题,我们需要增加接口熔断、限流和降级处理。</p><h2 id="第12招-全链路监控体系" tabindex="-1"><a class="header-anchor" href="#第12招-全链路监控体系"><span>第12招:全链路监控体系</span></a></h2><p><strong>问题场景</strong>:<br> 线上问题定位困难,缺乏数据支撑</p><p>我们需要增加项目全链路的监控。</p><p><strong>监控方案</strong>:</p><div class="language-yml line-numbers-mode" data-highlighter="shiki" data-ext="yml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-yml"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># SpringBoot配置</span></span>
120<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">management</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
121<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">  endpoints</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
122<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">    web</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
123<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">      exposure</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
124<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">        include</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">&quot;*&quot;</span></span>
125<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">  metrics</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
126<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">    export</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
127<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">      prometheus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">:</span></span>
128<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">        enabled</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">true</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里使用了prometheus监控。</p><p><strong>监控架构</strong>:</p><p><img src="https://files.mdnice.com/user/5303/ca6fade8-994a-4646-9dcc-945bdfe896b6.png" alt=""></p><p><strong>核心监控指标</strong>:</p><p><img src="https://files.mdnice.com/user/5303/62344f6d-459e-40c3-9871-2646d705927c.png" alt=""></p><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结"><span>总结</span></a></h2><h3 id="springboot性能优化检查清单" tabindex="-1"><a class="header-anchor" href="#springboot性能优化检查清单"><span>SpringBoot性能优化检查清单</span></a></h3><ul><li>连接池参数按业务调整</li><li>JVM参数经过压测验证</li><li>所有查询走缓存机制</li><li>批量操作替代逐条处理</li><li>线程池按场景定制</li><li>全链路监控覆盖</li></ul><p><img src="https://files.mdnice.com/user/5303/a9f579bd-cb69-4cd6-b2ee-ac7a9cf71407.png" alt=""></p><p><strong>三条黄金法则</strong>:</p><ol><li><strong>预防性优化</strong>:编码时考虑性能影响</li><li><strong>数据驱动</strong>:用监控指标指导优化方向</li><li><strong>持续迭代</strong>:性能优化是持续过程</li></ol><p><strong>性能工具包</strong></p><ul><li>Arthas在线诊断</li><li>JProfiler性能分析</li><li>Prometheus监控体系</li></ul><p>(看着监控大屏上平稳的QPS曲线,我知道今晚可以睡个好觉了...)</p><div class="article-referral-ad"><p>最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad3" rel="nofollow">这个链接</a>(或许真的能够帮到你)。</p></div>`,128)])])}const k=i(e,[["render",h]]),r=JSON.parse('{"path":"/article/12-spring-boot-performance-optimizations.html","title":"SpringBoot性能优化12招","lang":"zh-CN","frontmatter":{"title":"SpringBoot性能优化12招","date":"2025-05-25T16:13:00.000Z","category":["高并发"],"tags":["性能优化","Spring"],"description":"前言 不知道你在SpringBoot项目中,有没有遇到过下面这样的代码: 一次性查询了所有的订单ï¼
128Œå…¨è¡¨æ‰«æ50万数据,导致接口查询性能很差,严重的时候可能会导致OOM问题。 问题定位 : + 未分页查询 + 无缓存机制 + 未启用批量处理 ","author":"苏三","sidebar":false,"head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"TechArticle\\",\\"headline\\":\\"SpringBoot性能优化12招\\",\\"description\\":\\"前言 不知道你在SpringBoot项目中,有没有遇到过下面这样的代码: 一次性查询了所有的订单,全表扫描50万数据,导致接口查询性能很差,严重的时候可能会导致OOM问题。 问题定位 : + 未分页查询 + 无缓存机制 + 未启用批量处理 \\",\\"keywords\\":\\"SpringBoot性能优化12招,性能优化,Spring,高并发\\",\\"image\\":\\"https://files.mdnice.com/user/5303/f9081770-66e4-4c3d-93a9-adb099d364aa.png\\",\\"datePublished\\":\\"2025-05-25T16:13:00.000Z\\",\\"dateModified\\":\\"2025-05-25T16:13:00.000Z\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"苏三\\",\\"url\\":\\"https://www.susan.net.cn/contact/\\"},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"name\\":\\"Java突击队\\",\\"url\\":\\"https://www.susan.net.cn\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"url\\":\\"https://www.susan.net.cn/logo.png\\"}},\\"mainEntityOfPage\\":{\\"@type\\":\\"WebPage\\",\\"@id\\":\\"https://www.susan.net.cn/article/12-spring-boot-performance-optimizations.html\\"},\\"inLanguage\\":\\"zh-CN\\"}"],["meta",{"property":"og:url","content":"https://www.susan.net.cn/article/12-spring-boot-performance-optimizations.html"}],["meta",{"property":"og:site_name","content":"项目实战网 - Java突击队"}],["meta",{"property":"og:title","content":"SpringBoot性能优化12招"}],["meta",{"property":"og:description","content":"前言 不知道你在SpringBoot项目中,有没有遇到过下面这样的代码: 一次性查询了所有的订单,全表扫描50万数据,导致接口查询性能很差,严重的时候可能会导致OOM问题。 问题定位 : + 未分页查询 + 无缓存机制 + 未启用批量处理 "}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://files.mdnice.com/user/5303/f9081770-66e4-4c3d-93a9-adb099d364aa.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"苏三"}],["meta",{"property":"article:tag","content":"Spring"}],["meta",{"property":"article:tag","content":"性能优化"}],["meta",{"property":"article:published_time","content":"2025-05-25T16:13:00.000Z"}],["link",{"rel":"canonical","href":"https://www.susan.net.cn/article/12-spring-boot-performance-optimizations.html"}],["meta",{"name":"keywords","content":"SpringBoot性能优化12招,性能优化,Spring"}],["meta",{"name":"robots","content":"index,follow,archive"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:title","content":"SpringBoot性能优化12招"}],["meta",{"name":"twitter:description","content":"前言 不知道你在SpringBoot项目中,有没有遇到过下面这样的代码: 一次性查询了所有的订单,全表扫描50万数据,导致接口查询性能很差,严重的时候可能会导致OOM问题。 问题定位 : + 未分页查询 + 无缓存机制 + 未启用批量处理 "}]]},"git":{},"filePathRelative":"article/12-spring-boot-performance-optimizations.md","excerpt":"<h2>前言</h2>\\n\\n<div class=\\"article-referral-ad\\">\\n<p>最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的<a class=\\"article-referral-ad-link\\" href=\\"/pay/project.html?from=article_ad1\\" rel=\\"nofollow\\">这个链接</a>(或许真的能够帮到你)。</p>\\n</div>\\n<p>不知道你在SpringBoot项目中,有没有遇到过下面这样的代码:</p>\\n<div class=\\"language-java line-numbers-mode\\" data-highlighter=\\"shiki\\" data-ext=\\"java\\" style=\\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\\"><pre class=\\"shiki shiki-themes one-light one-dark-pro vp-code\\"><code class=\\"language-java\\"><span class=\\"line\\"><span style=\\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\\">@</span><span style=\\"--shiki-light:#A626A4;--shiki-dark:#E5C07B\\">GetMapping</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\">(</span><span style=\\"--shiki-light:#50A14F;--shiki-dark:#98C379\\">\\"/orders\\"</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\">)</span></span>\\n<span class=\\"line\\"><span style=\\"--shiki-light:#A626A4;--shiki-dark:#C678DD\\">public</span><span style=\\"--shiki-light:#C18401;--shiki-dark:#E5C07B\\"> List</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#56B6C2\\">&lt;</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\">Order</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#56B6C2\\">&gt;</span><span style=\\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\\"> listOrders</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\">() {</span></span>\\n<span class=\\"line\\"><span style=\\"--shiki-light:#A626A4;--shiki-dark:#C678DD\\">    return</span><span style=\\"--shiki-light:#E45649;--shiki-dark:#E5C07B\\"> orderDao</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\\">.</span><span style=\\"--shiki-light:#4078F2;--shiki-dark:#61AFEF\\">findAll</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#ABB2BF\\">();</span><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\"> </span></span>\\n<span class=\\"line\\"><span style=\\"--shiki-light:#383A42;--shiki-dark:#E06C75\\">}</span></span></code></pre>\\n<div class=\\"line-numbers\\" aria-hidden=\\"true\\" style=\\"counter-reset:line-number 0\\"><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div></div></div>"}');export{k as comp,r as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.