<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>性能优化 on 文艺技术笔记</title>
        <link>https://wenyiblog.top/categories/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/</link>
        <description>Recent content in 性能优化 on 文艺技术笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>文艺技术笔记 | 软件工程师文艺</copyright>
        <lastBuildDate>Wed, 29 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://wenyiblog.top/categories/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>国产数据库流式查询与批量写入调优：达梦/GaussDB连接参数的性能全景拆解</title>
        <link>https://wenyiblog.top/2026/07/dm-gaussdb-stream-batch-tuning/</link>
        <pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate>
        
        <guid>https://wenyiblog.top/2026/07/dm-gaussdb-stream-batch-tuning/</guid>
        <description>&lt;p&gt;有句话说，数据库调优的80%收益藏在连接层。这句话放在国产数据库迁移场景下，尤其贴切。&lt;/p&gt;
&lt;p&gt;很多团队从 Oracle、MySQL 迁移到达梦（DM）或 GaussDB 之后，SQL 语句一行没改，性能却出现了明显退化。排查一圈之后发现，瓶颈不在 SQL 本身，而在 &lt;strong&gt;JDBC 连接参数&lt;/strong&gt; 上——流式查询没开启、批量重写没生效、预编译缓存命中率低得可怜。&lt;/p&gt;
&lt;p&gt;这篇文章从连接 URL 中最容易被忽视的几个参数入手，结合 Spring Boot 的集成实践，做一次系统性的拆解。&lt;/p&gt;
&lt;h2 id=&#34;一为什么连接参数比-sql-更重要&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%9e%e6%8e%a5%e5%8f%82%e6%95%b0%e6%af%94-sql-%e6%9b%b4%e9%87%8d%e8%a6%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一、为什么连接参数比 SQL 更重要
&lt;/h2&gt;&lt;p&gt;在传统的 MySQL/Oracle 开发中，我们很少关注 JDBC URL 里的附加参数。大多数情况下，&lt;code&gt;jdbc:mysql://host:port/db&lt;/code&gt; 就够了，驱动层的默认值已经足够合理。&lt;/p&gt;
&lt;p&gt;但国产数据库的情况不太一样。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;核心差异在于：&lt;/strong&gt; 达梦和 GaussDB 的 JDBC 驱动在默认配置下，倾向于&amp;quot;安全优先&amp;quot;而非&amp;quot;性能优先&amp;quot;。这意味着很多高性能特性需要显式开启。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个设计选择有其合理性。在信创替代的大背景下，国产数据库需要保证与 Oracle、MySQL 的最大兼容性，确保迁移过来的应用能够&amp;quot;先跑起来&amp;quot;。性能优化则是第二阶段的事情——但很多团队停留在第一阶段，从未进入第二阶段。&lt;/p&gt;
&lt;p&gt;具体来说，有三个维度最容易踩坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结果集传输方式&lt;/strong&gt;：默认是全量加载到内存，而非流式读取&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;批量语句处理&lt;/strong&gt;：默认逐条发送，而非批量重写成单条 SQL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预编译策略&lt;/strong&gt;：默认的语句缓存和参数绑定策略与 Oracle 存在差异&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面逐一展开。&lt;/p&gt;
&lt;h2 id=&#34;二达梦数据库流式查询参数深度拆解&#34;&gt;&lt;a href=&#34;#%e4%ba%8c%e8%be%be%e6%a2%a6%e6%95%b0%e6%8d%ae%e5%ba%93%e6%b5%81%e5%bc%8f%e6%9f%a5%e8%af%a2%e5%8f%82%e6%95%b0%e6%b7%b1%e5%ba%a6%e6%8b%86%e8%a7%a3&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;二、达梦数据库：流式查询参数深度拆解
&lt;/h2&gt;&lt;p&gt;流式查询的本质是让客户端与服务端之间建立一个&amp;quot;数据管道&amp;quot;，而非一次性倾倒。理解这一点，才能理解后续所有参数的设计意图。&lt;/p&gt;
&lt;h3 id=&#34;21-默认行为的隐患&#34;&gt;&lt;a href=&#34;#21-%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba%e7%9a%84%e9%9a%90%e6%82%a3&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2.1 默认行为的隐患
&lt;/h3&gt;&lt;p&gt;达梦 JDBC 驱动的默认行为是：执行查询后，将&lt;strong&gt;整个结果集一次性拉取到客户端内存&lt;/strong&gt;。对于小数据量的业务查询，这没有任何问题。但当查询结果达到十万、百万级时，内存开销会急剧膨胀。&lt;/p&gt;
&lt;p&gt;一个典型的场景：报表导出服务需要查询 200 万条记录并生成 CSV 文件。如果不做流式处理，JVM 堆内存需要至少预留 2-4GB 来承载 ResultSet 对象。&lt;/p&gt;
&lt;h3 id=&#34;22-流式查询的两种开启方式&#34;&gt;&lt;a href=&#34;#22-%e6%b5%81%e5%bc%8f%e6%9f%a5%e8%af%a2%e7%9a%84%e4%b8%a4%e7%a7%8d%e5%bc%80%e5%90%af%e6%96%b9%e5%bc%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2.2 流式查询的两种开启方式
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;方式一：URL 参数配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 JDBC URL 中追加 &lt;code&gt;fetchSize&lt;/code&gt; 相关参数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;dm://192.168.1.100:5236/mydb?fetchSize=1000&amp;amp;resultSetType=FORWARD_ONLY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;fetchSize&lt;/code&gt; 控制每次从服务端拉取的行数。设置为 1000 意味着驱动每次只从达梦服务端获取 1000 行数据，处理完后再请求下一批。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式二：Statement 级别设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在代码中通过 &lt;code&gt;setFetchSize()&lt;/code&gt; 方法控制：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PreparedStatement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;prepareStatement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;SELECT * FROM large_table WHERE status = ?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResultSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;TYPE_FORWARD_ONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResultSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;CONCUR_READ_ONLY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setFetchSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;ACTIVE&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ResultSet&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;executeQuery&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;23-fetchsize-的选型策略&#34;&gt;&lt;a href=&#34;#23-fetchsize-%e7%9a%84%e9%80%89%e5%9e%8b%e7%ad%96%e7%95%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2.3 fetchSize 的选型策略
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;fetchSize 值&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;内存占用&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;网络往返次数&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;100&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;极低&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;极高&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;超大宽表（单行 &amp;gt; 10KB）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;低&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;高&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;常规导出（百万级窄表）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;中&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;中&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;通用场景（推荐默认值）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;较高&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;较低&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;内网高带宽、简单查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;10000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;高&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;低&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;批量ETL、数据迁移&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;实践建议：&lt;/strong&gt; 在内网千兆环境下，&lt;code&gt;fetchSize=1000&lt;/code&gt; 是一个比较平衡的起点。如果单行数据较小（&amp;lt; 500 字节），可以提升到 2000-5000。如果单行包含大字段（BLOB/CLOB），建议降低到 200-500。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;24-一个容易忽略的前置条件&#34;&gt;&lt;a href=&#34;#24-%e4%b8%80%e4%b8%aa%e5%ae%b9%e6%98%93%e5%bf%bd%e7%95%a5%e7%9a%84%e5%89%8d%e7%bd%ae%e6%9d%a1%e4%bb%b6&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2.4 一个容易忽略的前置条件
&lt;/h3&gt;&lt;p&gt;达梦的流式查询有一个关键约束：&lt;strong&gt;ResultSet 的类型必须是 &lt;code&gt;TYPE_FORWARD_ONLY&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果使用了 &lt;code&gt;TYPE_SCROLL_INSENSITIVE&lt;/code&gt; 或 &lt;code&gt;TYPE_SCROLL_SENSITIVE&lt;/code&gt;，驱动会在内部将整个结果集缓存到客户端，即使设置了 &lt;code&gt;fetchSize&lt;/code&gt; 也无效。这个行为与 MySQL 的流式查询约束类似，但在达梦文档中并没有特别醒目的标注。&lt;/p&gt;
&lt;p&gt;在 Spring Boot + MyBatis 的场景下，可以通过 &lt;code&gt;ResultHandler&lt;/code&gt; 实现真正的流式处理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Select&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;SELECT * FROM order_detail WHERE create_date &amp;gt; #{startDate}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fetchSize&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resultSetType&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResultSetType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;FORWARD_ONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;streamOrders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;startDate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LocalDate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResultHandler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;三达梦数据库批量写入的参数调优&#34;&gt;&lt;a href=&#34;#%e4%b8%89%e8%be%be%e6%a2%a6%e6%95%b0%e6%8d%ae%e5%ba%93%e6%89%b9%e9%87%8f%e5%86%99%e5%85%a5%e7%9a%84%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;三、达梦数据库：批量写入的参数调优
&lt;/h2&gt;&lt;p&gt;批量写入是数据密集型应用的核心场景。无论是 ETL 数据导入、日志归档、还是批量订单处理，写入性能直接决定了系统的吞吐量上限。&lt;/p&gt;
&lt;h3 id=&#34;31-批量重写的核心逻辑&#34;&gt;&lt;a href=&#34;#31-%e6%89%b9%e9%87%8f%e9%87%8d%e5%86%99%e7%9a%84%e6%a0%b8%e5%bf%83%e9%80%bb%e8%be%91&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;3.1 批量重写的核心逻辑
&lt;/h3&gt;&lt;p&gt;批量写入是另一个性能黑洞。默认情况下，即使你使用了 &lt;code&gt;addBatch()&lt;/code&gt; + &lt;code&gt;executeBatch()&lt;/code&gt;，达梦驱动也可能将每条 INSERT 语句&lt;strong&gt;逐条发送到服务端&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这跟 MySQL 的 &lt;code&gt;rewriteBatchedStatements&lt;/code&gt; 参数是同一个问题。达梦提供了类似的机制：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;dm://192.168.1.100:5236/mydb?batchNotOnCall=true&amp;amp;useBatch=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useBatch=true&lt;/code&gt;：启用客户端批量缓冲&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batchNotOnCall=true&lt;/code&gt;：对存储过程调用不做批量处理（避免兼容性问题）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-批量重写的实际效果&#34;&gt;&lt;a href=&#34;#32-%e6%89%b9%e9%87%8f%e9%87%8d%e5%86%99%e7%9a%84%e5%ae%9e%e9%99%85%e6%95%88%e6%9e%9c&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;3.2 批量重写的实际效果
&lt;/h3&gt;&lt;p&gt;以一个典型的批量插入场景为例：向 &lt;code&gt;order_detail&lt;/code&gt; 表插入 10 万条记录，每条记录包含 8 个字段。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;写入方式&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;耗时（秒）&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;网络往返次数&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;服务端解析次数&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;逐条 INSERT&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;342&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;100,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;100,000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;addBatch（未启用重写）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;186&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;100,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;100,000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;addBatch + useBatch=true&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;28&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;200&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;200&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;拼接 VALUES 多值插入&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;22&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;200&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;200&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;COPY 协议（dmfldr）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;8&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键发现：&lt;/strong&gt; 开启 &lt;code&gt;useBatch&lt;/code&gt; 之后，驱动会将多条 INSERT 语句重写为单条多值 INSERT（&lt;code&gt;INSERT INTO t VALUES (...), (...), (...)&lt;/code&gt;），网络往返和服务端解析次数都大幅下降。性能提升通常在 &lt;strong&gt;5-10 倍&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;33-批量大小batchsize的选择&#34;&gt;&lt;a href=&#34;#33-%e6%89%b9%e9%87%8f%e5%a4%a7%e5%b0%8fbatchsize%e7%9a%84%e9%80%89%e6%8b%a9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;3.3 批量大小（batchSize）的选择
&lt;/h3&gt;&lt;p&gt;批量大小不是越大越好。这里涉及到一个&amp;quot;收益递减&amp;quot;的拐点问题。&lt;/p&gt;
&lt;p&gt;当 batchSize 从 1 增加到 500 时，性能提升几乎是线性的——因为网络往返次数在急剧下降。但从 500 到 5000，提升幅度开始放缓，因为服务端单次处理的 SQL 文本已经足够长，解析和执行的开销开始占据主导地位。超过某个阈值后，性能甚至会下降——因为巨大的 SQL 文本会触发服务端的内存重分配。&lt;/p&gt;
&lt;p&gt;过大的批次还会导致：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SQL 语句超长&lt;/strong&gt;：超过达梦服务端的 &lt;code&gt;MAX_SQL_LENGTH&lt;/code&gt; 限制（默认 4MB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务日志膨胀&lt;/strong&gt;：单个大事务占用过多 redo log 空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存压力转移&lt;/strong&gt;：从客户端转移到服务端的解析缓冲区&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁等待加剧&lt;/strong&gt;：大批次意味着更长的持有锁时间，并发写入冲突概率上升&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;推荐的 batchSize 范围：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BATCH_SIZE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 通用推荐值&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 字段少（&amp;lt; 5列）、值短（&amp;lt; 50字符）的场景可以到 1000-2000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 字段多（&amp;gt; 20列）或包含长文本的场景降到 100-200&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 Spring Boot 中，配合 &lt;code&gt;JdbcTemplate&lt;/code&gt; 的 &lt;code&gt;batchUpdate&lt;/code&gt; 方法使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;batchInsertOrders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sql&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;INSERT INTO orders (order_no, user_id, amount, status, create_time) VALUES (?, ?, ?, ?, ?)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;batchUpdate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sql&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BatchPreparedStatementSetter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;setValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PreparedStatement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SQLException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Order&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getOrderNo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setLong&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getUserId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setBigDecimal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getAmount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getStatus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setTimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Timestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;valueOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getCreateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getBatchSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;orders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;四预编译参数被低估的性能杠杆&#34;&gt;&lt;a href=&#34;#%e5%9b%9b%e9%a2%84%e7%bc%96%e8%af%91%e5%8f%82%e6%95%b0%e8%a2%ab%e4%bd%8e%e4%bc%b0%e7%9a%84%e6%80%a7%e8%83%bd%e6%9d%a0%e6%9d%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;四、预编译参数：被低估的性能杠杆
&lt;/h2&gt;&lt;p&gt;预编译是数据库性能优化中最容易被&amp;quot;想当然&amp;quot;的领域。很多开发者以为用了 &lt;code&gt;PreparedStatement&lt;/code&gt; 就万事大吉了，实际上驱动端和服务端的预编译策略是否生效、缓存命中率多高，才是决定性能上限的关键因素。&lt;/p&gt;
&lt;h3 id=&#34;41-达梦的预编译缓存机制&#34;&gt;&lt;a href=&#34;#41-%e8%be%be%e6%a2%a6%e7%9a%84%e9%a2%84%e7%bc%96%e8%af%91%e7%bc%93%e5%ad%98%e6%9c%ba%e5%88%b6&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;4.1 达梦的预编译缓存机制
&lt;/h3&gt;&lt;p&gt;达梦数据库的服务端有语句缓存（类似 Oracle 的 Shared Pool），JDBC 驱动端也有 &lt;code&gt;PreparedStatement&lt;/code&gt; 缓存。两层的命中率共同决定了预编译的实际收益。&lt;/p&gt;
&lt;p&gt;URL 中的关键参数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;dm://192.168.1.100:5236/mydb?preparedStatementCacheSize=100&amp;amp;preparedStatementCacheSqlSize=2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;preparedStatementCacheSize&lt;/code&gt;：驱动端缓存的 PreparedStatement 数量（默认 0，即不缓存）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preparedStatementCacheSqlSize&lt;/code&gt;：只有 SQL 文本长度小于该值的语句才会被缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;42-预编译-vs-直接执行的性能差异&#34;&gt;&lt;a href=&#34;#42-%e9%a2%84%e7%bc%96%e8%af%91-vs-%e7%9b%b4%e6%8e%a5%e6%89%a7%e8%a1%8c%e7%9a%84%e6%80%a7%e8%83%bd%e5%b7%ae%e5%bc%82&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;4.2 预编译 vs 直接执行的性能差异
&lt;/h3&gt;&lt;p&gt;在高并发的 OLTP 场景下，预编译的收益主要体现在：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;减少服务端解析开销&lt;/strong&gt;：同一条 SQL 只需要硬解析一次，后续使用软解析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低网络传输量&lt;/strong&gt;：绑定参数比完整 SQL 文本更短&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防止 SQL 注入&lt;/strong&gt;：这是安全层面的收益，不在本文讨论范围&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;执行方式&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;单条耗时（ms）&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;QPS（4核8G）&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;CPU 利用率&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Statement 直接执行&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;3.2&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;8,500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;78%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;PreparedStatement（无缓存）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;2.1&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;12,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;62%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;PreparedStatement + 驱动缓存&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1.4&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;18,500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;45%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;数据解读：&lt;/strong&gt; 开启驱动端缓存后，CPU 利用率从 78% 降到 45%，说明大量解析工作被省掉了。QPS 提升约 &lt;strong&gt;2.2 倍&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;43-与-hikaricp-的配合&#34;&gt;&lt;a href=&#34;#43-%e4%b8%8e-hikaricp-%e7%9a%84%e9%85%8d%e5%90%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;4.3 与 HikariCP 的配合
&lt;/h3&gt;&lt;p&gt;Spring Boot 默认使用 HikariCP 作为连接池。HikariCP 本身也有一层 PreparedStatement 缓存，与达梦驱动端的缓存可能产生&lt;strong&gt;双重缓存&lt;/strong&gt;问题。&lt;/p&gt;
&lt;p&gt;建议的策略：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;datasource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hikari&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data-source-properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;preparedStatementCacheSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 关闭驱动端缓存，由 HikariCP 统一管理&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;preparedStatementCacheSqlSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data-source-property&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cachePrepStmts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# HikariCP 层面的缓存开关&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prepStmtCacheSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;250&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 每个连接缓存 250 条语句&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prepStmtCacheSqlLimit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# SQL 长度上限&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原则是只保留一层缓存&lt;/strong&gt;，避免内存浪费和缓存不一致。&lt;/p&gt;
&lt;h2 id=&#34;五gaussdb-连接参数的差异化配置&#34;&gt;&lt;a href=&#34;#%e4%ba%94gaussdb-%e8%bf%9e%e6%8e%a5%e5%8f%82%e6%95%b0%e7%9a%84%e5%b7%ae%e5%bc%82%e5%8c%96%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;五、GaussDB 连接参数的差异化配置
&lt;/h2&gt;&lt;h3 id=&#34;51-gaussdb-与达梦的参数体系对比&#34;&gt;&lt;a href=&#34;#51-gaussdb-%e4%b8%8e%e8%be%be%e6%a2%a6%e7%9a%84%e5%8f%82%e6%95%b0%e4%bd%93%e7%b3%bb%e5%af%b9%e6%af%94&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;5.1 GaussDB 与达梦的参数体系对比
&lt;/h3&gt;&lt;p&gt;如果你维护的是一个混合数据库架构——比如核心业务跑在达梦上，而报表分析跑在 GaussDB 上——那么参数配置的差异会让运维工作变得复杂。两个数据库虽然都兼容 JDBC 标准，但在扩展参数的命名和语义上存在显著差异。&lt;/p&gt;
&lt;p&gt;GaussDB（华为云）的 JDBC 驱动基于 PostgreSQL 协议，参数体系与达梦有本质差异。如果你同时维护两套数据源，需要注意参数命名和语义的映射关系。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;功能&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;达梦参数&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;GaussDB 参数&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;备注&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;流式查询&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;fetchSize&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;defaultRowFetchSize&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;GaussDB 在 URL 层设置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;批量重写&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;useBatch&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;reWriteBatchedInserts&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;语义等价，命名不同&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;预编译缓存&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheSize&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheQueries&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;GaussDB 默认 256&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;TCP 保活&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;socketTimeout&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;socketTimeout&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;相同&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;SSL 加密&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ssl=true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ssl=true&amp;amp;sslmode=require&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;GaussDB 需要额外指定模式&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;52-gaussdb-流式查询的特殊性&#34;&gt;&lt;a href=&#34;#52-gaussdb-%e6%b5%81%e5%bc%8f%e6%9f%a5%e8%af%a2%e7%9a%84%e7%89%b9%e6%ae%8a%e6%80%a7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;5.2 GaussDB 流式查询的特殊性
&lt;/h3&gt;&lt;p&gt;GaussDB 基于 PostgreSQL 协议，其流式查询的行为与 PG 一致：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;postgresql://gaussdb-host:5432/mydb?defaultRowFetchSize=1000&amp;amp;prepareThreshold=5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里有一个 GaussDB（PG 系）特有的参数——&lt;code&gt;prepareThreshold&lt;/code&gt;。它控制一条 SQL 被执行多少次之后才转为服务端预编译（server-side prepared statement）。默认值是 5。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么要延迟预编译？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为对于只执行一次的 SQL，服务端预编译反而增加了额外开销（一次 Parse + 一次 Bind + 一次 Execute，而非简单的 Simple Query）。设置 &lt;code&gt;prepareThreshold=5&lt;/code&gt; 意味着前 4 次执行走简单协议，第 5 次开始走扩展协议。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;调优建议：&lt;/strong&gt; 如果你的业务以短查询为主（同一条 SQL 被高频重复执行），可以将 &lt;code&gt;prepareThreshold&lt;/code&gt; 降低到 2-3。如果以 Ad-hoc 查询为主（每次 SQL 都不同），可以设置为 0 甚至 -1 来完全禁用服务端预编译。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;53-gaussdb-批量写入的-rewritebatchedinserts&#34;&gt;&lt;a href=&#34;#53-gaussdb-%e6%89%b9%e9%87%8f%e5%86%99%e5%85%a5%e7%9a%84-rewritebatchedinserts&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;5.3 GaussDB 批量写入的 rewriteBatchedInserts
&lt;/h3&gt;&lt;p&gt;GaussDB 的批量重写参数 &lt;code&gt;reWriteBatchedInserts=true&lt;/code&gt; 与 MySQL 的 &lt;code&gt;rewriteBatchedStatements&lt;/code&gt; 功能完全一致：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;postgresql://gaussdb-host:5432/mydb?reWriteBatchedInserts=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;开启后，驱动会将：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;INSERT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;INTO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;VALUES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 经过 addBatch 三次后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;重写为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;INSERT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;INTO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;VALUES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这在 GaussDB 上的性能提升通常在 &lt;strong&gt;3-8 倍&lt;/strong&gt;，具体取决于单条 INSERT 的复杂度和网络延迟。&lt;/p&gt;
&lt;h3 id=&#34;54-gaussdb-特有的-copy-协议&#34;&gt;&lt;a href=&#34;#54-gaussdb-%e7%89%b9%e6%9c%89%e7%9a%84-copy-%e5%8d%8f%e8%ae%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;5.4 GaussDB 特有的 COPY 协议
&lt;/h3&gt;&lt;p&gt;GaussDB 继承了 PostgreSQL 的 COPY 协议，这是目前已知最快的批量数据加载方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 使用 GaussDB 的 CopyManager 实现超高速批量导入&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CopyManager&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copyManager&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CopyManager&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BaseConnection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copySql&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;COPY orders (order_no, user_id, amount, status) FROM STDIN WITH (FORMAT csv)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Reader&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reader&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BufferedReader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FileReader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/data/orders.csv&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copyManager&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;copyIn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copySql&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;批量导入完成：{} 行&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;性能对比（100 万行数据）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;方式&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;耗时&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;INSERT + addBatch + rewrite&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;45 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;通用 JDBC 方案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;COPY 协议&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;8 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;GaussDB/PG 专有&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;外部表 (GDS)&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;3 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;GaussDB MPP 场景&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;六spring-boot-多数据源场景下的统一配置&#34;&gt;&lt;a href=&#34;#%e5%85%adspring-boot-%e5%a4%9a%e6%95%b0%e6%8d%ae%e6%ba%90%e5%9c%ba%e6%99%af%e4%b8%8b%e7%9a%84%e7%bb%9f%e4%b8%80%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;六、Spring Boot 多数据源场景下的统一配置
&lt;/h2&gt;&lt;h3 id=&#34;61-applicationyml-的完整模板&#34;&gt;&lt;a href=&#34;#61-applicationyml-%e7%9a%84%e5%ae%8c%e6%95%b4%e6%a8%a1%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;6.1 application.yml 的完整模板
&lt;/h3&gt;&lt;p&gt;当项目同时连接达梦和 GaussDB 时，配置需要分开管理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;datasource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 达梦数据源&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jdbc-url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jdbc:dm://dm-host:5236/mydb?fetchSize=1000&amp;amp;useBatch=true&amp;amp;batchNotOnCall=true&amp;amp;preparedStatementCacheSize=0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver-class-name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dm.jdbc.driver.DmDriver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SYSDBA&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;xxxxx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hikari&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;maximum-pool-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;minimum-idle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;connection-timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;idle-timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;600000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-lifetime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1800000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# GaussDB 数据源&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;gauss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jdbc-url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;jdbc:postgresql://gauss-host:5432/mydb?defaultRowFetchSize=1000&amp;amp;reWriteBatchedInserts=true&amp;amp;prepareThreshold=5&amp;amp;preparedStatementCacheQueries=256&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;driver-class-name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;org.postgresql.Driver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gauss_user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;xxxxx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hikari&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;maximum-pool-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;minimum-idle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;connection-timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;idle-timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;600000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max-lifetime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1800000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;62-多数据源配置类&#34;&gt;&lt;a href=&#34;#62-%e5%a4%9a%e6%95%b0%e6%8d%ae%e6%ba%90%e9%85%8d%e7%bd%ae%e7%b1%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;6.2 多数据源配置类
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MultiDataSourceConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@ConfigurationProperties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;spring.datasource.dm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSource&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;dmDataSource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSourceBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@ConfigurationProperties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prefix&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;spring.datasource.gauss&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSource&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;gaussDataSource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSourceBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Primary&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;dmJdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Qualifier&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dmDataSource&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSource&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setFetchSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 全局默认 fetchSize&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;gaussJdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Qualifier&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gaussDataSource&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataSource&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JdbcTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setFetchSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;63-连接池大小与-fetchsize-的联动关系&#34;&gt;&lt;a href=&#34;#63-%e8%bf%9e%e6%8e%a5%e6%b1%a0%e5%a4%a7%e5%b0%8f%e4%b8%8e-fetchsize-%e7%9a%84%e8%81%94%e5%8a%a8%e5%85%b3%e7%b3%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;6.3 连接池大小与 fetchSize 的联动关系
&lt;/h3&gt;&lt;p&gt;这里有一个容易被忽视的联动效应：&lt;strong&gt;连接池大小 × fetchSize = 最大内存占用&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;假设连接池 &lt;code&gt;maximum-pool-size=20&lt;/code&gt;，每个连接同时处理一个流式查询，&lt;code&gt;fetchSize=5000&lt;/code&gt;，每行数据约 1KB：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最大内存占用 = 20 × 5000 × 1KB = 100MB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看起来不多，但如果每行数据包含大字段（比如 50KB 的 JSON），结果就变成了 5GB。&lt;/p&gt;
&lt;p&gt;更隐蔽的问题在于：当多个线程同时执行流式查询时，每个线程持有的 ResultSet 对象在遍历完成之前都不会释放。如果业务逻辑中存在&amp;quot;查了一半就不读了&amp;quot;的情况（比如提前 return、异常中断），这些未读完的 ResultSet 会一直占用服务端游标资源，直到连接归还或超时。&lt;/p&gt;
&lt;p&gt;达梦服务端的 &lt;code&gt;MAX_SESSION_STATEMENT&lt;/code&gt; 参数限制了单个会话同时持有的打开游标数量。如果应用频繁出现&amp;quot;游标泄漏&amp;quot;，很快就会触发 &lt;code&gt;ORA-01000: maximum open cursors exceeded&lt;/code&gt; 类似的错误。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;建议：&lt;/strong&gt; 连接池大小和 fetchSize 需要联动计算。在内存受限的服务上，宁可减小 fetchSize 多跑几轮网络，也不要让 JVM 因为 GC 停顿而整体变慢。同时，务必在 &lt;code&gt;finally&lt;/code&gt; 块或 try-with-resources 中关闭 ResultSet，避免服务端游标泄漏。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;七性能对比全参数调优前后的差距&#34;&gt;&lt;a href=&#34;#%e4%b8%83%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94%e5%85%a8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98%e5%89%8d%e5%90%8e%e7%9a%84%e5%b7%ae%e8%b7%9d&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;七、性能对比：全参数调优前后的差距
&lt;/h2&gt;&lt;p&gt;理论讲完了，来看实际数据。&lt;/p&gt;
&lt;p&gt;下面是一组在实际项目中的测试结果。测试环境：4 核 8G 应用服务器，千兆内网连接达梦 8 集群（3 节点）和 GaussDB 505（主备）。每组测试重复执行 5 次取中位数，排除冷启动和缓存波动的影响。&lt;/p&gt;
&lt;h3 id=&#34;71-场景一百万级查询导出&#34;&gt;&lt;a href=&#34;#71-%e5%9c%ba%e6%99%af%e4%b8%80%e7%99%be%e4%b8%87%e7%ba%a7%e6%9f%a5%e8%af%a2%e5%af%bc%e5%87%ba&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;7.1 场景一：百万级查询导出
&lt;/h3&gt;&lt;p&gt;查询条件：&lt;code&gt;SELECT * FROM order_detail WHERE create_date BETWEEN ? AND ?&lt;/code&gt;，结果集约 150 万行，单行约 800 字节。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;配置&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦耗时&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB耗时&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;JVM 峰值堆&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;默认参数（无流式）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;超时 OOM&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;超时 OOM&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;&amp;gt; 4GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;fetchSize=1000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;68 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;72 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;512MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;fetchSize=5000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;54 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;58 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;820MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;fetchSize=5000 + 游标分页&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;49 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;51 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;480MB&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;72-场景二十万级批量插入&#34;&gt;&lt;a href=&#34;#72-%e5%9c%ba%e6%99%af%e4%ba%8c%e5%8d%81%e4%b8%87%e7%ba%a7%e6%89%b9%e9%87%8f%e6%8f%92%e5%85%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;7.2 场景二：十万级批量插入
&lt;/h3&gt;&lt;p&gt;写入目标：&lt;code&gt;order_detail&lt;/code&gt; 表，8 列，含索引 2 个。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;配置&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦耗时&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB耗时&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;事务日志量&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;逐条 INSERT&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;285 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;312 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;2.1GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;addBatch（默认）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;156 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;178 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;2.1GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;addBatch + 批量重写&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;32 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;28 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1.8GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;批量重写 + 禁用索引重建&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;26 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;21 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1.2GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;COPY / dmfldr&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;9 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;7 秒&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0.8GB&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;73-场景三高并发短查询oltp&#34;&gt;&lt;a href=&#34;#73-%e5%9c%ba%e6%99%af%e4%b8%89%e9%ab%98%e5%b9%b6%e5%8f%91%e7%9f%ad%e6%9f%a5%e8%af%a2oltp&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;7.3 场景三：高并发短查询（OLTP）
&lt;/h3&gt;&lt;p&gt;模拟 100 并发，每条查询为单表主键查询 &lt;code&gt;SELECT * FROM user_info WHERE user_id = ?&lt;/code&gt;。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;配置&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦 QPS&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB QPS&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;P99 延迟&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Statement 直接执行&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;12,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;14,500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;18ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;PreparedStatement（无缓存）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;18,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;21,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;11ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;PreparedStatement + 缓存&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;26,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;28,500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;7ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;缓存 + 连接预热&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;28,500&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;31,000&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5ms&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;八socket-与网络层参数的隐性影响&#34;&gt;&lt;a href=&#34;#%e5%85%absocket-%e4%b8%8e%e7%bd%91%e7%bb%9c%e5%b1%82%e5%8f%82%e6%95%b0%e7%9a%84%e9%9a%90%e6%80%a7%e5%bd%b1%e5%93%8d&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;八、Socket 与网络层参数的隐性影响
&lt;/h2&gt;&lt;p&gt;很多性能问题看起来是数据库层面的，最终却发现根源在网络层。达梦和 GaussDB 的 JDBC 驱动都暴露了一批 Socket 级别的参数，合理配置能够显著改善长尾延迟。&lt;/p&gt;
&lt;h3 id=&#34;81-tcpnodelay-与-nagle-算法&#34;&gt;&lt;a href=&#34;#81-tcpnodelay-%e4%b8%8e-nagle-%e7%ae%97%e6%b3%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;8.1 tcpNoDelay 与 Nagle 算法
&lt;/h3&gt;&lt;p&gt;Nagle 算法的设计初衷是减少小数据包的网络开销——它会将多个小的 TCP 段合并成一个大的段再发送。这在文件传输场景下是好事，但在数据库交互场景下，它会引入不必要的延迟。&lt;/p&gt;
&lt;p&gt;数据库的每一次查询-响应都是一个完整的请求-响应周期。如果驱动发送 SQL 语句时触发了 Nagle 合并，查询的执行会被延迟几十甚至上百毫秒，只为了等待&amp;quot;凑够&amp;quot;更多的数据一起发送。&lt;/p&gt;
&lt;p&gt;达梦和 GaussDB 的驱动默认都已开启 &lt;code&gt;tcpNoDelay=true&lt;/code&gt;，但有些团队在运维层面通过系统参数关闭了它（&lt;code&gt;net.ipv4.tcp_no_metrics_save = 1&lt;/code&gt;），导致驱动设置被覆盖。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 检查 Linux 系统的 Nagle 算法状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /proc/sys/net/ipv4/tcp_no_metrics_save
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 检查特定连接的 tcp_nodelay 状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ss -ti &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -A5 &lt;span class=&#34;s2&#34;&gt;&amp;#34;dst=dm-host&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;82-sockettimeout-的正确姿势&#34;&gt;&lt;a href=&#34;#82-sockettimeout-%e7%9a%84%e6%ad%a3%e7%a1%ae%e5%a7%bf%e5%8a%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;8.2 socketTimeout 的正确姿势
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;socketTimeout&lt;/code&gt; 控制的是 Socket 读取操作的超时时间。设置为 0 表示无限等待，这在生产环境中是极其危险的——如果达梦服务端出现 hang 住（比如死锁等待、磁盘 IO 阻塞），客户端线程会永远阻塞在那里，直到连接池耗尽。&lt;/p&gt;
&lt;p&gt;但 &lt;code&gt;socketTimeout&lt;/code&gt; 也不能设置得太短。一个复杂查询可能需要执行 30 秒以上，如果超时设置为 10 秒，这个查询就会被强制中断。&lt;/p&gt;
&lt;p&gt;推荐的分级策略：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;查询类型&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;建议 socketTimeout&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;OLTP 短查询&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;10,000 ms&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;主键/索引查询，毫秒级返回&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;报表查询&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;120,000 ms&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;聚合/分组查询，可能需要较长执行时间&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;批量导出&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;300,000 ms&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;大数据量流式查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;DDL 操作&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;600,000 ms&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;表结构变更，可能涉及锁等待&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;实践建议：&lt;/strong&gt; 不要对所有查询使用统一的 &lt;code&gt;socketTimeout&lt;/code&gt;。可以在 URL 中设置一个保守的默认值（如 60 秒），然后在业务代码中对已知耗时较长的查询通过 &lt;code&gt;Statement.setQueryTimeout()&lt;/code&gt; 单独设置更宽松的超时。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;83-连接保活与断线检测&#34;&gt;&lt;a href=&#34;#83-%e8%bf%9e%e6%8e%a5%e4%bf%9d%e6%b4%bb%e4%b8%8e%e6%96%ad%e7%ba%bf%e6%a3%80%e6%b5%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;8.3 连接保活与断线检测
&lt;/h3&gt;&lt;p&gt;达梦和 GaussDB 的长连接都可能遇到&amp;quot;静默断连&amp;quot;的问题——网络设备（防火墙、负载均衡器）会清理长时间无数据传输的 TCP 连接，但不会通知客户端。客户端拿着一个&amp;quot;看起来正常&amp;quot;的连接去发查询，才发现连接已经死了。&lt;/p&gt;
&lt;p&gt;解决方案是在 JDBC URL 中开启 TCP 保活：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 达梦&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;dm://host:5236/mydb?tcpKeepAlive=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# GaussDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;jdbc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;postgresql://host:5432/mydb?tcpKeepAlive=true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配合 HikariCP 的 &lt;code&gt;maxLifetime&lt;/code&gt; 参数（建议设置为 30 分钟），可以有效避免连接池中的&amp;quot;僵尸连接&amp;quot;。&lt;/p&gt;
&lt;h2 id=&#34;九踩坑记录与调优清单&#34;&gt;&lt;a href=&#34;#%e4%b9%9d%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95%e4%b8%8e%e8%b0%83%e4%bc%98%e6%b8%85%e5%8d%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;九、踩坑记录与调优清单
&lt;/h2&gt;&lt;p&gt;经过多个项目的实践，我整理了一份调优检查清单。每次接入新的国产数据库时，逐项核对即可。&lt;/p&gt;
&lt;h3 id=&#34;91-达梦常见踩坑点&#34;&gt;&lt;a href=&#34;#91-%e8%be%be%e6%a2%a6%e5%b8%b8%e8%a7%81%e8%b8%a9%e5%9d%91%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;9.1 达梦常见踩坑点
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;fetchSize 设置后无效&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查 ResultSet 类型是否为 &lt;code&gt;TYPE_FORWARD_ONLY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查 MyBatis 是否使用了 &lt;code&gt;@Options(resultSetType = ResultSetType.FORWARD_ONLY)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查是否在事务中持有多个 ResultSet（达梦不支持同一事务内多个活跃游标）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;批量插入没有性能提升&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认 URL 中包含 &lt;code&gt;useBatch=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查 SQL 是否为标准 INSERT 语法（子查询、MERGE 等不支持批量重写）&lt;/li&gt;
&lt;li&gt;确认 batchSize 未超过 &lt;code&gt;MAX_SQL_LENGTH&lt;/code&gt; 限制&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PreparedStatement 缓存导致内存泄漏&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 SQL 是动态拼接的（每次都不同），缓存只会增长不会命中&lt;/li&gt;
&lt;li&gt;解决：关闭缓存，或确保使用参数化查询&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;92-gaussdb-常见踩坑点&#34;&gt;&lt;a href=&#34;#92-gaussdb-%e5%b8%b8%e8%a7%81%e8%b8%a9%e5%9d%91%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;9.2 GaussDB 常见踩坑点
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;prepareThreshold 导致首次查询慢&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前 N 次执行走 Simple Query 协议，延迟略高&lt;/li&gt;
&lt;li&gt;解决：对于热点 SQL，可以通过连接初始化脚本预热&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;reWriteBatchedInserts 对 RETURNING 子句不生效&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 INSERT 语句包含 &lt;code&gt;RETURNING&lt;/code&gt; 子句，批量重写会被跳过&lt;/li&gt;
&lt;li&gt;解决：批量插入场景去掉 RETURNING，改用 &lt;code&gt;getGeneratedKeys()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSL 连接的性能损耗&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GaussDB 跨公网连接时通常需要 SSL，加解密开销约 5-15%&lt;/li&gt;
&lt;li&gt;解决：在内网环境使用 &lt;code&gt;sslmode=disable&lt;/code&gt;，仅在跨网时启用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;93-通用调优清单&#34;&gt;&lt;a href=&#34;#93-%e9%80%9a%e7%94%a8%e8%b0%83%e4%bc%98%e6%b8%85%e5%8d%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;9.3 通用调优清单
&lt;/h3&gt;&lt;p&gt;按优先级排序的调优步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第一步&lt;/strong&gt;：开启流式查询（fetchSize），解决内存问题&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第二步&lt;/strong&gt;：开启批量重写（useBatch / reWriteBatchedInserts），解决写入性能&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第三步&lt;/strong&gt;：配置预编译缓存（统一由连接池管理），提升 OLTP 吞吐&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第四步&lt;/strong&gt;：调整连接池参数（pool size、timeout），匹配并发模型&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第五步&lt;/strong&gt;：TCP 层面调优（socketTimeout、tcpNoDelay），解决长尾延迟&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;第六步&lt;/strong&gt;：大批量场景评估专用协议（COPY / dmfldr），获取极限性能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十连接参数的完整速查表&#34;&gt;&lt;a href=&#34;#%e5%8d%81%e8%bf%9e%e6%8e%a5%e5%8f%82%e6%95%b0%e7%9a%84%e5%ae%8c%e6%95%b4%e9%80%9f%e6%9f%a5%e8%a1%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;十、连接参数的完整速查表
&lt;/h2&gt;&lt;p&gt;最后附上一张参数速查表，方便在项目中直接引用。&lt;/p&gt;
&lt;h3 id=&#34;达梦-jdbc-url-参数&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6-jdbc-url-%e5%8f%82%e6%95%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦 JDBC URL 参数
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;参数名&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;默认值&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;推荐值&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;fetchSize&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0（全量）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1000&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;每次从服务端拉取的行数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;useBatch&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;false&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;启用批量语句重写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;batchNotOnCall&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;false&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;存储过程不参与批量重写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheSize&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0（交由HikariCP）&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;驱动端预编译缓存数量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheSqlSize&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;可缓存SQL的最大长度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;socketTimeout&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;60000&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Socket 读取超时（毫秒）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;loginTimeout&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;10000&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;连接建立超时（毫秒）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;tcpNoDelay&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;禁用 Nagle 算法&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;gaussdb-jdbc-url-参数&#34;&gt;&lt;a href=&#34;#gaussdb-jdbc-url-%e5%8f%82%e6%95%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB JDBC URL 参数
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;参数名&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;默认值&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;推荐值&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;defaultRowFetchSize&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0（全量）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1000&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;每次拉取行数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;reWriteBatchedInserts&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;false&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;启用批量INSERT重写&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;prepareThreshold&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;3-5&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;转为服务端预编译的阈值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheQueries&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;256&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;预编译语句缓存数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;preparedStatementCacheSizeMiB&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;缓存大小上限（MB）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;socketTimeout&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;60000&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Socket 超时（秒）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;tcpKeepAlive&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;false&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;true&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;TCP 保活&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;sslmode&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;prefer&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;require/ disable&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;SSL 模式（按网络环境选择）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;连接参数的调优往往是一次性投入、长期收益的事情。花一个小时把上面这张表过一遍，可能比花一周去优化 SQL 语句带来的提升更显著。&lt;/p&gt;
&lt;p&gt;在国产数据库替代的大趋势下，理解每个参数背后的机制，而不是机械地复制粘贴配置，才是真正可持续的工程能力。&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
