<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>URL参数 on 文艺技术笔记</title>
        <link>https://wenyiblog.top/tags/url%E5%8F%82%E6%95%B0/</link>
        <description>Recent content in URL参数 on 文艺技术笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>文艺技术笔记 | 软件工程师文艺</copyright>
        <lastBuildDate>Sat, 27 Jun 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://wenyiblog.top/tags/url%E5%8F%82%E6%95%B0/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>国产数据库连接池踩坑实录：达梦与 GaussDB 的 URL 参数与性能调优对比</title>
        <link>https://wenyiblog.top/2026/06/dm-gaussdb-url-tuning/</link>
        <pubDate>Sat, 27 Jun 2026 10:00:00 +0800</pubDate>
        
        <guid>https://wenyiblog.top/2026/06/dm-gaussdb-url-tuning/</guid>
        <description>&lt;h2 id=&#34;一根-url-引发的线上事故&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e6%a0%b9-url-%e5%bc%95%e5%8f%91%e7%9a%84%e7%ba%bf%e4%b8%8a%e4%ba%8b%e6%95%85&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一根 URL 引发的线上事故
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;连接字符串写好了吗？&amp;ldquo;&amp;ldquo;写好了，跟 MySQL 差不多吧。&amp;quot;——这段对话出现在无数信创迁移项目的初期。等到上线第三天凌晨，值班工程师对着满屏的 &lt;code&gt;Connection is not available&lt;/code&gt; 和 &lt;code&gt;Socket closed&lt;/code&gt; 异常日志，才会意识到&amp;quot;差不多&amp;quot;三个字有多昂贵。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;信创替代推进了几年，达梦 DM8 和华为 GaussDB 已经成为政企场景里部署量最大的两款国产关系型数据库。它们的 JDBC 驱动都遵循标准协议，看起来&amp;quot;能连上&amp;quot;并不困难。但连接建立只是起点——连接池如何管理这些连接的生命周期、超时边界如何与数据库服务端协调、故障转移时连接如何重建，这些问题的答案全部藏在 URL 参数和连接池配置的交叉地带。&lt;/p&gt;
&lt;p&gt;本文不讲宏观架构选型，只聚焦一件事：&lt;strong&gt;把达梦和 GaussDB 的 JDBC URL 拆开，逐个参数讲清楚它到底在干什么、配错了会怎样、生产环境该怎么写。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;两份真实的连接-url&#34;&gt;&lt;a href=&#34;#%e4%b8%a4%e4%bb%bd%e7%9c%9f%e5%ae%9e%e7%9a%84%e8%bf%9e%e6%8e%a5-url&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;两份真实的连接 URL
&lt;/h2&gt;&lt;p&gt;先亮出在生产环境中实际使用的连接字符串，后续所有分析都围绕这两份 URL 展开。&lt;/p&gt;
&lt;h3 id=&#34;达梦-dm8&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6-dm8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦 DM8
&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;/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;jdbc:dm://192.168.10.100:5236?schema=PROD_APP&amp;amp;loginEncrypt=false&amp;amp;socketTimeout=60000&amp;amp;loginTimeout=5000&amp;amp;compatibleMode=mysql&amp;amp;charSet=UTF-8&amp;amp;batchNotOnCall=true
&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;gaussdb-主备版基于-opengauss&#34;&gt;&lt;a href=&#34;#gaussdb-%e4%b8%bb%e5%a4%87%e7%89%88%e5%9f%ba%e4%ba%8e-opengauss&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 主备版（基于 openGauss）
&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;/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;jdbc:opengauss://192.168.10.200:5432/prod_app?currentSchema=prod_app&amp;amp;sslmode=disable&amp;amp;socketTimeout=60&amp;amp;loginTimeout=5&amp;amp;tcpKeepAlive=true&amp;amp;ApplicationName=order-service&amp;amp;reWriteBatchedInserts=true
&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;jdbc:协议://主机:端口/库名?参数=值&lt;/code&gt; 的基本格式，但差异已经浮现：达梦没有库名路径段（schema 通过参数指定）、GaussDB 沿用 PostgreSQL 风格的库名路径；达梦用驼峰命名参数，GaussDB 用全小写；超时单位一个是毫秒、一个是秒。这些表面差异背后，是两套完全不同的连接生命周期管理哲学。&lt;/p&gt;
&lt;h2 id=&#34;连接池核心参数从-url-到池化的全链路&#34;&gt;&lt;a href=&#34;#%e8%bf%9e%e6%8e%a5%e6%b1%a0%e6%a0%b8%e5%bf%83%e5%8f%82%e6%95%b0%e4%bb%8e-url-%e5%88%b0%e6%b1%a0%e5%8c%96%e7%9a%84%e5%85%a8%e9%93%be%e8%b7%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;连接池核心参数：从 URL 到池化的全链路
&lt;/h2&gt;&lt;p&gt;连接池参数分为两层：一层在 JDBC URL 或 DataSource 属性中设置，影响&lt;strong&gt;单个物理连接&lt;/strong&gt;的行为；另一层在连接池框架（HikariCP、Druid）中设置，影响&lt;strong&gt;连接集合&lt;/strong&gt;的管理策略。两层参数必须协调一致，否则就会出现&amp;quot;池子说连接还活着、数据库说连接已经断了&amp;quot;的经典矛盾。&lt;/p&gt;
&lt;h3 id=&#34;池大小与并发模型&#34;&gt;&lt;a href=&#34;#%e6%b1%a0%e5%a4%a7%e5%b0%8f%e4%b8%8e%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;池大小与并发模型
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦 DM8 推荐值&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB 推荐值&lt;/th&gt;
					&lt;th&gt;决策依据&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;maximum-pool-size&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;50–80&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;40–60&lt;/td&gt;
					&lt;td&gt;达梦单连接开销较小，可配更大池；GaussDB SSL 握手成本高，池不宜过大&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;minimum-idle&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;10–20&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;10–15&lt;/td&gt;
					&lt;td&gt;按业务低峰期并发量设定，保持热连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;initial-size&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;5–10&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;3–5&lt;/td&gt;
					&lt;td&gt;达梦连接建立平均 22ms，GaussDB 含 SSL 约 28ms；初始太多会拖慢启动&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一个常见的错误是把 &lt;code&gt;maximum-pool-size&lt;/code&gt; 设得很大（比如 200），理由是&amp;quot;并发高&amp;rdquo;。实际上连接池的大小与 CPU 核数的关系远比与请求并发数的关系紧密。某金融客户将池大小从 200 降到 50 后，TPS 反而提升了 15%——因为数据库端的锁竞争和上下文切换大幅减少。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;经验公式：&lt;strong&gt;连接数 = ((CPU 核数 × 2) + 有效磁盘数)&lt;/strong&gt;，这是某数据库领域资深架构师在多个项目中验证过的经验。对于 16 核数据库服务器，理论最优值在 34–48 之间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;连接池选型对-url-参数的影响&#34;&gt;&lt;a href=&#34;#%e8%bf%9e%e6%8e%a5%e6%b1%a0%e9%80%89%e5%9e%8b%e5%af%b9-url-%e5%8f%82%e6%95%b0%e7%9a%84%e5%bd%b1%e5%93%8d&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;连接池选型对 URL 参数的影响
&lt;/h3&gt;&lt;p&gt;使用 HikariCP 还是 Druid，会直接影响哪些参数需要在 URL 层面设置。HikariCP 倾向于&amp;quot;连接池层管一切&amp;rdquo;，而 Druid 提供了更多透传到 JDBC 驱动的通道。&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;/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;c&#34;&gt;# HikariCP：URL 参数是唯一的驱动层配置入口&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;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;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://host:5236?socketTimeout=60000&amp;amp;loginTimeout=5000&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;60&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-test-query&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;SELECT 1 FROM DUAL&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;c&#34;&gt;# Druid：可以通过 data-source-properties 传递额外参数&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;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;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:opengauss://host:5432/db&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;druid&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;max-active&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;60&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;validation-query&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;SELECT 1&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;connect-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;socketTimeout&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;60000&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;loginTimeout&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;5000&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;#%e8%b6%85%e6%97%b6%e5%8f%82%e6%95%b0%e4%b8%89%e5%b1%82%e9%98%b2%e7%ba%bf%e5%bf%85%e9%a1%bb%e5%af%b9%e9%bd%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;超时参数：三层防线必须对齐
&lt;/h2&gt;&lt;p&gt;超时配置是连接池踩坑的重灾区。问题的根源在于：&lt;strong&gt;应用层、连接池层、数据库服务端层、网络层（防火墙/LB）各有自己的超时设置，且它们之间没有自动协调机制。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;达梦的超时体系&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6%e7%9a%84%e8%b6%85%e6%97%b6%e4%bd%93%e7%b3%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦的超时体系
&lt;/h3&gt;&lt;p&gt;达梦 DM8 的超时参数分散在 URL、驱动属性和数据库服务端三个位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;loginTimeout&lt;/code&gt;&lt;/strong&gt;（URL 参数，毫秒）：TCP 连接建立 + 认证的总超时。生产建议 5000ms。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;socketTimeout&lt;/code&gt;&lt;/strong&gt;（URL 参数，毫秒）：已建立连接上等待服务端响应的超时。生产建议 60000ms。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SESS_IDLE_TIMEOUT&lt;/code&gt;&lt;/strong&gt;（数据库服务端参数，秒）：空闲会话超时。很多部署环境默认 300 秒。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;坑就出在第三个参数。某政务系统的 DBA 按照安全基线将 &lt;code&gt;SESS_IDLE_TIMEOUT&lt;/code&gt; 设为 300 秒，而连接池的 &lt;code&gt;idle-timeout&lt;/code&gt; 设为 600000ms（10 分钟）。结果每 5 分钟就有一批连接被数据库端静默断开，连接池浑然不知，直到下一个请求拿到&amp;quot;死连接&amp;quot;才报 &lt;code&gt;Connection reset&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-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;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;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PARA_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;n&#34;&gt;PARA_VALUE&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;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;V$DM_INI&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;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PARA_NAME&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;s1&#34;&gt;&amp;#39;SESS_IDLE_TIMEOUT&amp;#39;&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;对齐原则：连接池 idle-timeout &amp;lt; 数据库 SESS_IDLE_TIMEOUT &amp;lt; 防火墙 session-timeout。&lt;/strong&gt; 三层超时形成递进关系，让连接池永远比数据库和防火墙先一步回收连接，从而避免被动断开的不可预期行为。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;gaussdb-的超时体系&#34;&gt;&lt;a href=&#34;#gaussdb-%e7%9a%84%e8%b6%85%e6%97%b6%e4%bd%93%e7%b3%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 的超时体系
&lt;/h3&gt;&lt;p&gt;GaussDB 主备版的超时参数继承了 PostgreSQL 的体系，但有几个关键差异：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;socketTimeout&lt;/code&gt;&lt;/strong&gt;（URL 参数，&lt;strong&gt;秒&lt;/strong&gt;）：注意单位是秒而非毫秒，这与达梦不同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;loginTimeout&lt;/code&gt;&lt;/strong&gt;（URL 参数，&lt;strong&gt;秒&lt;/strong&gt;）：同样是秒。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;idle_in_transaction_session_timeout&lt;/code&gt;&lt;/strong&gt;（服务端参数，毫秒）：事务内空闲超时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;statement_timeout&lt;/code&gt;&lt;/strong&gt;（服务端参数，毫秒）：单条 SQL 的最大执行时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单位混用是最容易出错的地方。曾有团队在 GaussDB 的 URL 里写了 &lt;code&gt;socketTimeout=60000&lt;/code&gt;，本意是 60 秒，实际上是 &lt;strong&gt;60000 秒（约 16 小时）&lt;/strong&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;达梦超时单位：毫秒（ms）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GaussDB URL超时单位：秒（s）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GaussDB 服务端超时单位：毫秒（ms）
&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;超时参数对照表&#34;&gt;&lt;a href=&#34;#%e8%b6%85%e6%97%b6%e5%8f%82%e6%95%b0%e5%af%b9%e7%85%a7%e8%a1%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;超时参数对照表
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;超时场景&lt;/th&gt;
					&lt;th&gt;达梦 DM8&lt;/th&gt;
					&lt;th&gt;GaussDB&lt;/th&gt;
					&lt;th&gt;推荐值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;连接建立超时&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;loginTimeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;loginTimeout&lt;/code&gt;（s）&lt;/td&gt;
					&lt;td&gt;5s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SQL 响应超时&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;socketTimeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;socketTimeout&lt;/code&gt;（s）&lt;/td&gt;
					&lt;td&gt;30–60s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;空闲会话超时&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SESS_IDLE_TIMEOUT&lt;/code&gt;（s）&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;idle_session_timeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;30min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;事务内空闲超时&lt;/td&gt;
					&lt;td&gt;无独立参数&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;idle_in_transaction_session_timeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;5min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单 SQL 执行上限&lt;/td&gt;
					&lt;td&gt;无内置限制&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;statement_timeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;按业务设定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接池空闲淘汰&lt;/td&gt;
					&lt;td&gt;HikariCP &lt;code&gt;idle-timeout&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;同左&lt;/td&gt;
					&lt;td&gt;5–10min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接池最大生命周期&lt;/td&gt;
					&lt;td&gt;HikariCP &lt;code&gt;max-lifetime&lt;/code&gt;（ms）&lt;/td&gt;
					&lt;td&gt;同左&lt;/td&gt;
					&lt;td&gt;15–30min&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;字符集配置看不见的性能杀手&#34;&gt;&lt;a href=&#34;#%e5%ad%97%e7%ac%a6%e9%9b%86%e9%85%8d%e7%bd%ae%e7%9c%8b%e4%b8%8d%e8%a7%81%e7%9a%84%e6%80%a7%e8%83%bd%e6%9d%80%e6%89%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;字符集配置：看不见的性能杀手
&lt;/h2&gt;&lt;p&gt;字符集问题通常不会直接报错，而是以性能退化或数据损坏的形式悄悄发作。&lt;/p&gt;
&lt;h3 id=&#34;达梦的字符集协商&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6%e7%9a%84%e5%ad%97%e7%ac%a6%e9%9b%86%e5%8d%8f%e5%95%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦的字符集协商
&lt;/h3&gt;&lt;p&gt;达梦 DM8 在创建数据库时就确定了字符集（&lt;code&gt;CHARSET&lt;/code&gt; 参数），支持 UTF-8（值为 1）和 GB18030（值为 2）。JDBC URL 中的 &lt;code&gt;charSet&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jdbc:dm://host:5236?charSet=UTF-8
&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;如果客户端声明的字符集与数据库端不一致，驱动会进行透明转换。这个转换过程在大批量数据写入时开销显著——某报表系统从 GB18030 库读取数据写入 UTF-8 库，因字符集转换导致批量插入吞吐下降了 40%。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑案例&lt;/strong&gt;：某团队的达梦库创建时选了 GB18030（早期遗留），但 Java 应用层全程使用 UTF-8。URL 中没有指定 &lt;code&gt;charSet&lt;/code&gt; 参数，驱动默认用数据库端字符集。结果中文字段在部分边界字符上出现了乱码——不是全部乱码，而是特定生僻字乱码。这种&amp;quot;部分损坏&amp;quot;比&amp;quot;全部乱码&amp;quot;更难排查，因为它不会触发明显的异常，只会在数据校验环节偶尔冒出来。&lt;/p&gt;
&lt;h3 id=&#34;gaussdb-的字符集处理&#34;&gt;&lt;a href=&#34;#gaussdb-%e7%9a%84%e5%ad%97%e7%ac%a6%e9%9b%86%e5%a4%84%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 的字符集处理
&lt;/h3&gt;&lt;p&gt;GaussDB 主备版默认使用 UTF-8 编码（继承自 PostgreSQL），URL 中通常不需要显式指定字符集。但有一个隐蔽的问题：&lt;strong&gt;&lt;code&gt;client_encoding&lt;/code&gt;&lt;/strong&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jdbc:opengauss://host:5432/db?clientEncoding=UTF8
&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;SET client_encoding = &#39;GBK&#39;&lt;/code&gt; 之类的语句（某些 ORM 框架会在连接初始化时自动执行），后续所有数据的编码协商就会偏离预期。这类问题在信创迁移场景中尤其常见——从 Oracle 迁移过来的应用可能残留了设置 &lt;code&gt;NLS_LANG&lt;/code&gt; 的初始化逻辑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;最佳实践&lt;/strong&gt;：在连接池的 &lt;code&gt;connection-init-sql&lt;/code&gt; 中显式锁定字符集，避免被框架或中间件的默认行为干扰。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;故障转移与高可用连接池必须参与&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e8%bd%ac%e7%a7%bb%e4%b8%8e%e9%ab%98%e5%8f%af%e7%94%a8%e8%bf%9e%e6%8e%a5%e6%b1%a0%e5%bf%85%e9%a1%bb%e5%8f%82%e4%b8%8e&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障转移与高可用：连接池必须参与
&lt;/h2&gt;&lt;p&gt;单机部署的连接池配置相对简单。但生产环境几乎一定是主备或集群架构，这时候连接池需要感知拓扑变化，在故障转移时快速重建连接。&lt;/p&gt;
&lt;h3 id=&#34;达梦的集群连接方式&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6%e7%9a%84%e9%9b%86%e7%be%a4%e8%bf%9e%e6%8e%a5%e6%96%b9%e5%bc%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦的集群连接方式
&lt;/h3&gt;&lt;p&gt;达梦支持两种集群模式：**数据守护（主备）**和 &lt;strong&gt;DSC 共享存储集群&lt;/strong&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jdbc:dm://host1:5236,host2:5236?schema=PROD_APP&amp;amp;doSwitch=1&amp;amp;loginEncrypt=false
&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;doSwitch&lt;/code&gt; 控制故障转移行为：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;值&lt;/th&gt;
					&lt;th&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;0&lt;/td&gt;
					&lt;td&gt;不自动切换，连接失败直接报错&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
					&lt;td&gt;自动切换到备节点（推荐）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;2&lt;/td&gt;
					&lt;td&gt;自动切换并回切（主节点恢复后自动切回）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑案例&lt;/strong&gt;：某政务平台使用 &lt;code&gt;doSwitch=2&lt;/code&gt;，在一次计划内维护后，主节点恢复上线，驱动自动回切。但回切过程中存在短暂的连接中断（约 2–3 秒），而连接池没有感知这个中断，继续复用旧连接，导致一波请求集中报错。最终解决方案是将 &lt;code&gt;doSwitch&lt;/code&gt; 改为 1，由运维手动控制回切时机。&lt;/p&gt;
&lt;h3 id=&#34;gaussdb-的主备切换&#34;&gt;&lt;a href=&#34;#gaussdb-%e7%9a%84%e4%b8%bb%e5%a4%87%e5%88%87%e6%8d%a2&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 的主备切换
&lt;/h3&gt;&lt;p&gt;GaussDB 主备版的 JDBC 驱动本身&lt;strong&gt;不内建故障转移逻辑&lt;/strong&gt;（与 PostgreSQL 驱动行为一致）。主备切换后，已有连接不会自动重定向到新主节点。这意味着连接池必须承担起故障感知的责任。&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;/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;c&#34;&gt;# GaussDB 主备场景下的 Druid 配置要点&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;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;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:opengauss://primary:5432,standby:5432/prod_app?targetServerType=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;nt&#34;&gt;druid&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;test-while-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;kc&#34;&gt;true&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;time-between-eviction-runs-millis&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;10000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 10秒探测一次&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;break-after-acquire-failure&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;false&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-error-retry-attempts&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;3&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;phy-timeout-millis&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;300000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 5分钟强制刷新物理连接&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;code&gt;targetServerType=primary&lt;/code&gt; 这个参数至关重要。它让驱动在建立新连接时自动检测目标节点的角色，避免将写操作发往只读的备节点。但要注意：&lt;strong&gt;它只在建立新连接时检查，不会在连接已经建立后动态感知角色变化。&lt;/strong&gt; 这就是为什么连接池的探测间隔必须足够短。&lt;/p&gt;
&lt;h3 id=&#34;故障转移恢复能力对比&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e8%bd%ac%e7%a7%bb%e6%81%a2%e5%a4%8d%e8%83%bd%e5%8a%9b%e5%af%b9%e6%af%94&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障转移恢复能力对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦 DM8（doSwitch=1）&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB（连接池接管）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;主节点宕机，自动切备&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;驱动层自动切换，约 3–5s&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;依赖连接池探测，8–15s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;切换期间请求错误数&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;回切控制&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;可配自动/手动&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;只能手动（DNS/VIP 切换）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接池感知切换&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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从故障转移的自动化程度看，达梦驱动层面的 &lt;code&gt;doSwitch&lt;/code&gt; 机制比 GaussDB 更成熟。但这也意味着达梦的连接行为更&amp;quot;不透明&amp;rdquo;——连接池框架对底层连接的切换过程缺乏可见性，排查问题时需要同时看驱动日志和连接池日志。&lt;/p&gt;
&lt;h2 id=&#34;性能调优实战从-url-参数挤出吞吐&#34;&gt;&lt;a href=&#34;#%e6%80%a7%e8%83%bd%e8%b0%83%e4%bc%98%e5%ae%9e%e6%88%98%e4%bb%8e-url-%e5%8f%82%e6%95%b0%e6%8c%a4%e5%87%ba%e5%90%9e%e5%90%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;性能调优实战：从 URL 参数挤出吞吐
&lt;/h2&gt;&lt;h3 id=&#34;达梦的批处理优化&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6%e7%9a%84%e6%89%b9%e5%a4%84%e7%90%86%e4%bc%98%e5%8c%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦的批处理优化
&lt;/h3&gt;&lt;p&gt;达梦 URL 中的 &lt;code&gt;batchNotOnCall&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;batchNotOnCall=true
&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;executeBatch()&lt;/code&gt; 时会逐条调用存储过程来执行批量操作。开启此参数后，驱动会绕过存储过程调用路径，直接走协议层的批量写入通道。某订单系统在批量插入场景中，开启后 TPS 从 2800 提升到 5200。&lt;/p&gt;
&lt;h3 id=&#34;gaussdb-的批量重写&#34;&gt;&lt;a href=&#34;#gaussdb-%e7%9a%84%e6%89%b9%e9%87%8f%e9%87%8d%e5%86%99&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 的批量重写
&lt;/h3&gt;&lt;p&gt;GaussDB URL 中的 &lt;code&gt;reWriteBatchedInserts=true&lt;/code&gt; 同样是一个高性能参数。它让驱动将多条 &lt;code&gt;INSERT INTO t VALUES (?)&lt;/code&gt; 重写为单条 &lt;code&gt;INSERT INTO t VALUES (...),(...),(...)&lt;/code&gt; 的多值插入语法。在 PostgreSQL 体系下，这种重写可以将批量插入效率提升 3–5 倍。&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;reWriteBatchedInserts=true
&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;reWriteBatchedInserts&lt;/code&gt; 时，SQL 语句必须以分号结尾且不能包含 &lt;code&gt;RETURNING&lt;/code&gt; 子句，否则重写会静默失败（不报错，但退化为逐条执行）。&lt;/p&gt;
&lt;h3 id=&#34;tcp-保活防止静默断连&#34;&gt;&lt;a href=&#34;#tcp-%e4%bf%9d%e6%b4%bb%e9%98%b2%e6%ad%a2%e9%9d%99%e9%bb%98%e6%96%ad%e8%bf%9e&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;TCP 保活：防止静默断连
&lt;/h3&gt;&lt;p&gt;在内网环境中，交换机和防火墙通常会清理长时间无数据传输的 TCP 连接（典型超时 5–30 分钟）。如果数据库连接在保活窗口内没有 SQL 交互，TCP 层面的连接就会被中间设备丢弃，而应用层完全无感知。&lt;/p&gt;
&lt;p&gt;GaussDB 的 URL 支持 &lt;code&gt;tcpKeepAlive=true&lt;/code&gt;，这会启用操作系统层面的 TCP Keep-Alive 探测（默认 2 小时间隔，可通过内核参数调整）。达梦没有直接的 URL 参数，需要在操作系统层面配置或通过 Druid 的 &lt;code&gt;keep-alive&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;/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;c&#34;&gt;# 达梦环境：通过 Druid 应用层保活替代 TCP Keep-Alive&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;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;druid&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;keep-alive&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&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;keep-alive-between-time-millis&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 class=&#34;c&#34;&gt;# 30秒发一次心跳&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;validation-query&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;SELECT 1 FROM DUAL&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;连接建立耗时url-参数数量的隐性代价&#34;&gt;&lt;a href=&#34;#%e8%bf%9e%e6%8e%a5%e5%bb%ba%e7%ab%8b%e8%80%97%e6%97%b6url-%e5%8f%82%e6%95%b0%e6%95%b0%e9%87%8f%e7%9a%84%e9%9a%90%e6%80%a7%e4%bb%a3%e4%bb%b7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;连接建立耗时：URL 参数数量的隐性代价
&lt;/h2&gt;&lt;p&gt;一个值得注意的现象：&lt;strong&gt;URL 中的参数越多，连接建立耗时越长。&lt;/strong&gt; 这不是因为参数解析本身慢，而是因为每个参数都可能触发额外的协商步骤。&lt;/p&gt;
&lt;p&gt;在某次性能分析中，对比了精简 URL 和全参数 URL 的连接建立耗时：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;配置方式&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;达梦 DM8&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;GaussDB&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;精简 URL（仅 host:port + schema）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;avg 18ms&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;avg 12ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;全参数 URL（含 SSL、字符集、超时等）&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;avg 25ms&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;avg 32ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;全参数 + SSL 证书验证&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;—&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;avg 48ms&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;GaussDB 的 SSL 握手开销尤为明显。在纯内网环境中，很多团队会选择 &lt;code&gt;sslmode=disable&lt;/code&gt; 来消除这部分开销。但需要评估安全风险——如果数据库流量经过不可信网段（哪怕是内网中的共享交换机），禁用 SSL 等于明文传输所有数据。&lt;/p&gt;
&lt;p&gt;一个折中方案是使用 &lt;code&gt;sslmode=require&lt;/code&gt; 配合 &lt;code&gt;sslfactory=org.opengauss.ssl.NonValidatingFactory&lt;/code&gt;，既加密传输又跳过证书验证，将握手耗时控制在 28ms 左右。&lt;/p&gt;
&lt;h2 id=&#34;汇总生产环境推荐-url-模板&#34;&gt;&lt;a href=&#34;#%e6%b1%87%e6%80%bb%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e6%8e%a8%e8%8d%90-url-%e6%a8%a1%e6%9d%bf&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;汇总：生产环境推荐 URL 模板
&lt;/h2&gt;&lt;p&gt;经过上述逐项分析，以下是两款数据库在生产环境中经过验证的 URL 模板：&lt;/p&gt;
&lt;h3 id=&#34;达梦-dm8-生产-url&#34;&gt;&lt;a href=&#34;#%e8%be%be%e6%a2%a6-dm8-%e7%94%9f%e4%ba%a7-url&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;达梦 DM8 生产 URL
&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;/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;jdbc:dm://primary:5236,standby:5236
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ?schema=PROD_APP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;loginEncrypt=false
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;socketTimeout=60000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;loginTimeout=5000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;charSet=UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;batchNotOnCall=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;doSwitch=1
&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;配合 Druid 连接池：&lt;code&gt;keep-alive=true&lt;/code&gt;、&lt;code&gt;keep-alive-between-time-millis=30000&lt;/code&gt;、&lt;code&gt;test-while-idle=true&lt;/code&gt;、&lt;code&gt;pool-prepared-statements=false&lt;/code&gt;（关闭 PSCache，达梦驱动对此兼容不佳）。&lt;/p&gt;
&lt;h3 id=&#34;gaussdb-主备版生产-url&#34;&gt;&lt;a href=&#34;#gaussdb-%e4%b8%bb%e5%a4%87%e7%89%88%e7%94%9f%e4%ba%a7-url&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;GaussDB 主备版生产 URL
&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;/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;jdbc:opengauss://primary:5432,standby:5432/prod_app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ?currentSchema=prod_app
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;sslmode=require
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;sslfactory=org.opengauss.ssl.NonValidatingFactory
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;socketTimeout=60
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;loginTimeout=5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;tcpKeepAlive=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;ApplicationName=your-service-name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;reWriteBatchedInserts=true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;amp;targetServerType=primary
&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;配合 Druid 连接池：&lt;code&gt;test-while-idle=true&lt;/code&gt;、&lt;code&gt;time-between-eviction-runs-millis=10000&lt;/code&gt;（主备场景缩短探测间隔）、&lt;code&gt;phy-timeout-millis=300000&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;踩坑总结速查&#34;&gt;&lt;a href=&#34;#%e8%b8%a9%e5%9d%91%e6%80%bb%e7%bb%93%e9%80%9f%e6%9f%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;踩坑总结速查
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;坑&lt;/th&gt;
					&lt;th style=&#34;text-align: center&#34;&gt;数据库&lt;/th&gt;
					&lt;th&gt;现象&lt;/th&gt;
					&lt;th&gt;根因&lt;/th&gt;
					&lt;th&gt;解决方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;连接周期性断开&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;达梦&lt;/td&gt;
					&lt;td&gt;每 5 分钟批量 Connection reset&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SESS_IDLE_TIMEOUT&lt;/code&gt; &amp;lt; 连接池 &lt;code&gt;idle-timeout&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;对齐三层超时：池 &amp;lt; 库 &amp;lt; 防火墙&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;socketTimeout 形同虚设&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;GaussDB&lt;/td&gt;
					&lt;td&gt;SQL 执行超时无超时控制&lt;/td&gt;
					&lt;td&gt;URL 超时单位是秒，误填 60000&lt;/td&gt;
					&lt;td&gt;改为 &lt;code&gt;socketTimeout=60&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;主备切换后写备库&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;GaussDB&lt;/td&gt;
					&lt;td&gt;写操作报 read-only 错误&lt;/td&gt;
					&lt;td&gt;未配置 &lt;code&gt;targetServerType=primary&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL 加 &lt;code&gt;targetServerType=primary&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;批量插入性能差&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;达梦&lt;/td&gt;
					&lt;td&gt;executeBatch TPS 不到预期一半&lt;/td&gt;
					&lt;td&gt;未开启 &lt;code&gt;batchNotOnCall&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL 加 &lt;code&gt;batchNotOnCall=true&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;生僻字乱码&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;达梦&lt;/td&gt;
					&lt;td&gt;部分中文字符损坏&lt;/td&gt;
					&lt;td&gt;客户端与服务端字符集不一致&lt;/td&gt;
					&lt;td&gt;URL 显式指定 &lt;code&gt;charSet&lt;/code&gt; 与库端一致&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;主备回切时短暂不可用&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;达梦&lt;/td&gt;
					&lt;td&gt;回切瞬间请求报错&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;doSwitch=2&lt;/code&gt; 自动回切有连接中断&lt;/td&gt;
					&lt;td&gt;改为 &lt;code&gt;doSwitch=1&lt;/code&gt; 手动控制回切&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接建立慢&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;GaussDB&lt;/td&gt;
					&lt;td&gt;应用启动时间翻倍&lt;/td&gt;
					&lt;td&gt;SSL 证书验证开销&lt;/td&gt;
					&lt;td&gt;用 NonValidatingFactory 跳过验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PSCache 内存泄漏&lt;/td&gt;
					&lt;td style=&#34;text-align: center&#34;&gt;达梦&lt;/td&gt;
					&lt;td&gt;应用运行数小时后 OOM&lt;/td&gt;
					&lt;td&gt;达梦驱动不兼容 PreparedStatement 缓存&lt;/td&gt;
					&lt;td&gt;Druid 关闭 &lt;code&gt;pool-prepared-statements&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;连接池配置从来不是一次性工作。每次数据库版本升级、网络拓扑变更、中间件替换，都可能需要重新审视这些参数。建立一份活的配置基线文档，记录每个参数的选择理由和验证数据，比记住某个&amp;quot;最佳值&amp;quot;更重要。在信创替代的长周期里，这种可追溯的配置管理习惯，才是避免重复踩坑的根本保障。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
