资讯动态

从yamaha数据库PDF到MySQL落库:建表、索引与避坑指南

发布时间:2026/10/15 17:45:56 来源:尧图企业网站定制
简介YAMAHA元件数据库是一份面向电子制造、贴片编程与电路设计人员的元器件封装速查手册收录电阻、电容、线圈、三极管、功率管、二极管、LED、可调电阻及多种IC封装类型并给出对应编码规则与尺寸参数。资料以PDF格式提供单个文件仅68KB便于随时查阅与打印。内容覆盖R1005、R1608等贴片电阻C1005、C3216等电容以及TSOP、QFP、SOP、PLCC、SOJ等常见IC封装编号序列涵盖500系列电阻、600系列三极管、800系列PLCC等可帮助工程师在YAMAHA贴片机编程、物料清单核对或元件选型时快速定位封装代号与规格。对于从事SMT生产、电子工艺或器件库维护的人员这份数据库能减少重复查表时间提升元件识别的准确性与效率无论是产线编程还是研发阶段的封装确认均可直接对照使用。目前已有566人浏览学习实用性获得一定认可。1. 一份 yamaha数据库.pdf 的真实面孔它是设计文档不是照着建库的免检通行证拿到一份 yamaha数据库.pdf很多人的第一反应是当字典翻看表、看字段、照着建库。我最初也这么干结果建完发现对不上号——订单表里找不到乐器编号库存表没有门店维度索引页整页空白。这类PDF通常是雅马哈乐器门店业务的设计文档把店铺、乐器、订单、维修工单这些实体关系画到七成剩下三成状态机、索引、导入清洗要你自己补。这篇文章沿着「看懂文档 → 落库 → 查询优化 → 踩坑排查」走一遍适合拿着这份PDF做数据库课程设计的学生也适合在公司里照文档落雅马哈业务库的开发。先给结论文档能抄但不能照抄。2. 从 PDF 表结构到建库落地雅马哈业务库的核心表、字段类型与外键取舍2.1 先按业务分组读表PDF 里的店铺、乐器与维修工单对应哪几张表别从第一张表开始建。先把PDF里出现的表按业务分组你会发现它翻来覆去就四类基础档案、商品主数据、交易数据、服务数据。基础档案是 store门店、staff员工、customer客户、supplier供应商商品主数据是 instrument乐器和 instrument_model乐器型号交易数据是 sales_order销售订单和 order_detail订单明细服务数据是 repair_order维修工单和 repair_detail维修明细。实体关系我用下面这张表整理过照着它判断基数比看ER图的连线快实体关系基数判断依据store → staff1:N一个员工通常只归属一个门店instrument_model → instrument1:N一个型号下有多个序列号的乐器库存sales_order → order_detail1:N一张订单含多个明细行instrument ↔ supplierN:N一个供货商供多种乐器一种乐器也可多供应商必须拆中间表PDF最常见的坑是只画连线不写基数。落库时自己判断一个员工会不会同时在两家门店如果会staff和store就是多对多要拆出store_staff中间表。判断依据是业务规则不是图好不好看。2.2 建库建表的第一步字符集、存储引擎与门店表 DDL文档给的表结构往往不带字符集和引擎这两个参数决定后面数据能不能存对、能不能并发写。建库我一般直接上 utf8mb4而不是 utf8mb3门店备注里出现特殊符号时 utf8mb3 会报 Incorrect string value。MySQL 8.0 下常用的建库语句长这样CREATE DATABASE yamaha_business DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci;collate 选 utf8mb4_0900_ai_ci 是因为它在排序时对大小写不敏感门店名查起来顺手。如果你的目标库是 MySQL 5.7把 collate 换成 utf8mb4_general_ci效果差别不大但避免了版本不认识排序规则的问题。接下来建门店表这是最基础的一张后面所有表几乎都引用它的主键CREATE TABLE store ( store_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 门店ID, store_code VARCHAR(20) NOT NULL COMMENT 门店编码, store_name VARCHAR(120) NOT NULL COMMENT 门店名称, phone VARCHAR(30) NULL COMMENT 联系电话, address VARCHAR(255) NULL COMMENT 地址, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (store_id), UNIQUE KEY uk_store_code (store_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT门店表;store_id 用 INT UNSIGNED 而不是 INT是因为门店数通常到不了 21 亿但加个 UNSIGNED 能把上限翻倍代价几乎为零store_code 加唯一键因为业务上门店编码不允许重复这个约束交给数据库比交给应用可靠。created_at 和 updated_at 都交给数据库维护应用层插入时不用管省掉一大半时间字段没赋值的报错。乐器表要单独说序列号字段CREATE TABLE instrument ( instrument_id INT UNSIGNED NOT NULL AUTO_INCREMENT, sku VARCHAR(32) NOT NULL, instrument_name VARCHAR(120) NOT NULL, category VARCHAR(50) NOT NULL, unit_price DECIMAL(10,2) NOT NULL, stock_qty INT UNSIGNED NOT NULL DEFAULT 0, serial_no VARCHAR(64) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (instrument_id), UNIQUE KEY uk_serial (serial_no), KEY idx_category (category) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT乐器表;unit_price 用 DECIMAL 不是 FLOAT原因后面避坑章会单独展开这里先记结论金额一律 DECIMAL。serial_no 加唯一键因为乐器序列号天然唯一售后维修按序列号查乐器是最频繁的路径这个唯一键顺带把高频查询的索引也覆盖了。category 上建普通索引是因为门店盘点时常按乐器品类筛库存。销售订单表的主键策略要想清楚CREATE TABLE sales_order ( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL, store_id INT UNSIGNED NOT NULL, customer_id INT UNSIGNED NULL, order_date DATE NOT NULL, order_status TINYINT NOT NULL DEFAULT 0, ship_time DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (order_id), UNIQUE KEY uk_order_no (order_no), KEY idx_store_date (store_id, order_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT销售订单表;order_no 是业务编号暴露给下游系统用order_id 只做数据库内部主键。不要把订单号当主键因为订单号可能被业务方改格式主键一旦变更代价极大。order_status 用 TINYINT 存状态值而不是 VARCHAR状态含义由应用层统一维护数据库层面只保证取值范围。order_detail 和维修工单的表结构类似核心字段不外乎明细ID、主表ID、乐器ID、数量、单价这里不重复贴 DDL。提示PDF 里如果出现 id 字段不带类型说明落库前先想清楚它是业务编号还是代理主键。业务编号用 VARCHAR 加唯一键代理主键用自增 INT两种混用是后期数据对不上的常见原因。2.3 外键建还是不建从 ON DELETE 行为聊到国产库同步的额外成本PDF 的 ER 图上几乎每张表之间都画了线但生产环境建物理外键是要打问号的。建外键的好处是数据库帮你保证引用完整性坏处是删除父表记录时会被子表卡住而且在做异构数据库同步时外键约束会让导入顺序变得极其敏感。我一般这么取舍内部管理系统、单库单实例、并发量不大建要往达梦、人大金仓这类国产库做同步或者有分库分表计划的不建物理外键引用完整性交给应用层事务保证另起定时对账任务查孤儿数据。真需要建外键的时候写法是这样ALTER TABLE sales_order ADD CONSTRAINT fk_so_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON UPDATE CASCADE ON DELETE RESTRICT;ON UPDATE CASCADE 让门店ID变更时订单自动跟随ON DELETE RESTRICT 防止门店下有订单时被直接删掉。别用 ON DELETE SET NULL因为历史订单里的门店维度一旦变 NULL报表就缺了归属地这条我后面避坑章还会提。3. 把 yamaha数据库.pdf 里的关系变成能跑的增删改查JOIN、状态机与数据导入3.1 串起门店-乐器-订单四表 JOIN 的标准写法与拿不到数据时先查什么PDF 把四个实体画出来了真正查数时要 JOIN 四张表。最典型的场景是查某家门店一段时间内卖过哪些乐器SELECT o.order_no, s.store_name, i.instrument_name, od.quantity, od.unit_price FROM sales_order o JOIN store s ON o.store_id s.store_id JOIN order_detail od ON od.order_id o.order_id JOIN instrument i ON i.instrument_id od.instrument_id WHERE o.order_date 2024-01-01 AND s.store_id 3 ORDER BY o.order_date DESC;四张表全部 INNER JOIN因为我们要的是已经成交且有明细的订单不存在门店或悬空的明细。如果想让某家门店即使没订单也出现在结果里store 要改成 LEFT JOIN 并放在 FROM 左侧其他表保持 JOIN。这条 SQL 拿不到数据时先在 WHERE 里逐个条件试去掉 s.store_id 看有无数据再去掉 order_date 看是否日期写错最后查 order_detail 是否有行。我见过不下三次查不到数是因为 store_id 在门店表里根本不存在PDF 里的示例门店编号和实际库对不上。3.2 PDF 没画的订单状态机从「待支付」到「已完成」怎么安全流转PDF 通常只给了订单表字段状态值的流转规则一个字没写。状态机不落库也得落在应用层否则订单状态会乱。常见做法是 TINYINT 存状态值含义约定如下order_status含义0待支付1已支付待发货2已发货3已完成4已取消状态更新的 SQL 要带旧状态条件防止并发请求把单子重复流转UPDATE sales_order SET order_status 2, ship_time NOW() WHERE order_no YM20240115001 AND order_status 1;条件里写 AND order_status 1意思是只有已支付待发货的订单能发货。如果两条发货请求同时进来只有一条能把 1 改成 2另一条影响行数为 0应用层根据影响行数决定是重试还是报错。状态机还要配合逾期查询。比如业务要求待支付超过 24 小时的订单要人工介入SELECT order_no, store_id, created_at FROM sales_order WHERE order_status 0 AND created_at NOW() - INTERVAL 1 DAY;INTERVAL 1 DAY 是 MySQL 的时间运算标准写法别用减86400秒的方式算遇到夏令时和闰秒会偏差。注意 PDF 里如果订单时间用的是 DATETIME 而 order_date 是 DATE逾期判断必须用 created_at用 order_date 会把当天没支付的订单也捞出来。3.3 从 Excel 导入历史库存LOAD DATA 参数与先清洗还是先导入历史库存数据在 Excel 里躺着用 INSERT 一条条拼 SQL 会拼到怀疑人生。正确做法是先把 Excel 另存为 CSV清洗后再用 LOAD DATA 批量导入。Excel 默认导出的 CSV 是 GBK 编码行尾是 CRLF直接灌进 utf8mb4 的库必乱码。先转码iconv -f GBK -t UTF-8 instrument_2024.csv instrument_2024_utf8.csv然后入库LOAD DATA LOCAL INFILE /tmp/instrument_2024_utf8.csv INTO TABLE instrument CHARACTER SET utf8mb4 FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY LINES TERMINATED BY \r\n IGNORE 1 LINES (sku, instrument_name, category, unit_price, stock_qty) SET created_at NOW();LOAD DATA 的坑集中在四个参数上。FIELDS TERMINATED BY , 指定列分隔符OPTIONALLY ENCLOSED BY 处理含逗号的文本字段比如乐器名里的逗号LINES TERMINATED BY \r\n 必须和文件实际行尾一致Excel 转出来的 CSV 是 CRLF你用 \n 会把每行末尾的 \r 读进最后一个字段IGNORE 1 LINES 跳过表头。LOCAL INFILE 还要确认服务端开启 local_infile 参数MySQL 8.0 默认关闭没开的话会报 Loading local data is disabled。生产库开这个参数有安全风险导入完建议改回 OFF。导入前先把 SKU 去重LOAD DATA 在遇到唯一键冲突时默认报错中断你不想导到一半才发现有 300 条重复 SKU。3.4 按门店日期做日报聚合GROUP BY 与 HAVING 的边界第 3.1 节的查询是明细日报要的是每个门店每天卖了多少单、多少钱SELECT s.store_id, s.store_name, COUNT(DISTINCT o.order_no) AS order_cnt, SUM(od.quantity * od.unit_price) AS gmv FROM sales_order o JOIN order_detail od ON od.order_id o.order_id JOIN store s ON s.store_id o.store_id WHERE o.order_date BETWEEN 2024-01-01 AND 2024-01-31 GROUP BY s.store_id, s.store_name HAVING order_cnt 3 ORDER BY gmv DESC;WHERE 在分组前过滤行HAVING 在分组后过滤聚合结果这个边界容易混。这里订单数3是聚合后的条件必须放 HAVING放 WHERE 的话 MySQL 会直接报错因为 order_cnt 此时还不存在。COUNT(DISTINCT o.order_no) 统计的是订单数而不是明细行数因为一张订单有多行明细时 COUNT(*) 会重复计数。GMV 用 SUM(od.quantity * od.unit_price)unit_price 是 DECIMAL乘法结果不会出现浮点误差。数据量大时 COUNT(DISTINCT) 是性能瓶颈日报表建议改成提前在明细表冗余一个 order_no 的精确去重列或者用汇总表不要每次都扫订单明细。4. PDF 唯一没画全的部分索引设计、事务隔离级别与两个必调参数4.1 别只在主键上建索引订单表高频过滤字段的索引位PDF 里每个表都画了主键但主键只覆盖按ID查单条的场景。实际业务里 90% 的查询是按门店、日期、状态筛列表这些字段不加索引MySQL 只能全表扫。订单表最常见的索引需求是按门店日期查订单所以建库时我会加联合索引ALTER TABLE sales_order ADD INDEX idx_store_date (store_id, order_date); ALTER TABLE order_detail ADD INDEX idx_order (order_id);order_detail 的 order_id 索引服务于 JOINsales_order 的 idx_store_date 服务于按门店和日期的过滤。注意索引不是越多越好每多一个索引INSERT 和 UPDATE 就多一次索引写操作。订单表日增量大的话索引超过四五个就会明显拖慢写入。某个字段要不要建索引看区分度。order_status 只有 0 到 4 五个值而且大部分订单是已完成区分度极低优化器大概率放弃索引走全表扫建了也白建。PDF 里如果给 status 画了索引位落库时可以去掉。4.2 组合索引的列顺序从「店铺日期」说到最左前缀idx_store_date 是 (store_id, order_date) 的组合索引列顺序不是随便排的。MySQL 组合索引遵循最左前缀原则索引只能从左往右逐列匹配查询条件是否能用到 idx_store_dateWHERE store_id 3能WHERE store_id 3 AND order_date 2024-01-01能WHERE order_date 2024-01-01不能把区分度高的列放前面能把索引范围缩到最小。store_id 只有几十个门店区分度不高但它是等值条件order_date 区分度高但它是范围条件。实际经验是等值条件的列放前面范围条件的列放后面这样索引能先精确定位门店再在门店内扫日期范围。如果把顺序写成 (order_date, store_id)单独按门店查时索引无法命中因为 MySQL 不能跳过 order_date 直接使用 store_id。PDF 里如果索引顺序是乱排的建库前按查询频率重新排一遍。4.3 事务隔离级别与并发锁批量更新为什么互相堵住订单状态更新是最容易撞锁的场景。MySQL 默认隔离级别是 REPEATABLE_READ这个级别下一条带范围的 UPDATE 除了锁住命中的行还会在索引范围两端加间隙锁防止其他事务插入新数据。两个事务同时更新相邻范围时可能互相等对方释放间隙锁直到一方超时。排查锁等待先看参数SHOW VARIABLES LIKE innodb_lock_wait_timeout; SHOW ENGINE INNODB STATUS;innodb_lock_wait_timeout 默认 50 秒等 50 秒才报错对线上业务来说太久了。我一般调到 10 到 20 秒让失败来得更早、重试更及时SET GLOBAL innodb_lock_wait_timeout 10; SET SESSION innodb_lock_wait_timeout 10;SHOW ENGINE INNODB STATUS 的输出里LATEST DETECTED DEADLOCK 段会列出两个事务分别持有和等待的锁照着事务里的 SQL 就能定位是哪张表的哪段范围在打架。死锁和锁等待是两回事。死锁是 MySQL 检测到循环等待立即回滚其中一个事务锁等待是 A 等 B 提交B 没在等 A只能等到超时。出现锁等待时先看事务里有没有长时间不提交的操作比如一个事务里先查了 1000 条再逐条更新这种事务会把锁攥在手里很久。4.4 用 EXPLAIN 验证执行计划type、key、rows 三个字段索引建没建对不看感觉看 EXPLAINEXPLAIN SELECT o.order_no, i.instrument_name FROM sales_order o JOIN order_detail od ON od.order_id o.order_id JOIN instrument i ON i.instrument_id od.instrument_id WHERE o.store_id 3 AND o.order_date 2024-01-01;输出的关键看三个字段type、key、rows。type 出现 ALL 说明全表扫出现 ref 或 range 说明索引生效key 显示实际用到的索引名如果 key 是 NULL 但表上有索引要么没建对要么优化器认为扫全表更快rows 是估算扫描行数这条 SQL 建完索引后 rows 从几万降到几十说明索引生效。执行计划不是玄学。凡是报表查询超过 500 毫秒我第一件事就是 EXPLAIN看 type 是不是 ALL看 key 有没有命中。PDF 建库文档里如果完全没有索引设计那索引优化就是上线前最值得花时间的一步。注意EXPLAIN 不会真正执行查询线上库可以放心跑。但 EXPLAIN ANALYZE 会真执行生产环境慎用。5. 避坑与排查照着 yamaha数据库.pdf 建库最容易翻车的 5 个场景这章列的五条都是我实际踩过的每条按「现象 → 原因 → 解决」写照着排查能省半天。5.1 datetime 默认值报错1067 背后的 MySQL 版本差异现象执行 DDL 时报 ERROR 1067 (42000): Invalid default value for created_at。原因PDF 里的建表语句写的是 created_at DATETIME DEFAULT CURRENT_TIMESTAMP语法没错但目标库是 MySQL 5.6 之前的版本。DATETIME 自动初始化是 MySQL 5.6.5 才支持的老版本只允许 TIMESTAMP 带默认值。解决低版本把字段改成 TIMESTAMPALTER TABLE sales_order MODIFY created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;如果不想动表结构就升级数据库到 5.6 以上。落库前先确认目标库大版本再用 SELECT VERSION() 验证别让 PDF 里的 SQL 写法误导你。5.2 金额对不上FLOAT 与 DECIMAL 的精度差异现象订单金额 SUM 后出现 0.1 0.2 0.30000000000000004 这种尾差日报 GMV 总是差几分钱。原因PDF 字段类型写的是 FLOAT 或 DOUBLE。二进制浮点数无法精确表示十进制小数累加越多误差越明显。解决DDL 阶段就把金额字段固定为 DECIMAL(10,2)已建好的表用 MODIFY 改ALTER TABLE order_detail MODIFY unit_price DECIMAL(10,2) NOT NULL;DECIMAL(10,2) 表示整数部分 8 位、小数 2 位雅马哈乐器单价到百万级别都够用。如果数据已经污染先 UPDATE 把异常值修掉再改字段类型否则 MODIFY 可能因数据超范围报错。临时救急可以用 CAST(unit_price AS DECIMAL(10,2))但根治还是要改字段。5.3 Navicat 导入 CSV 乱码GBK、CRLF 和字符集下拉框现象Navicat 导入向导预览 CSV 时中文全问号导入后表里也是问号有时报文件行尾无法识别。原因Excel 另存的 CSV 是 GBK 编码、CRLF 行尾Navicat 默认按 UTF-8 解析。解决先转码再导入iconv -f GBK -t UTF-8 store.csv store_utf8.csv sed -i s/\r$// store_utf8.csvsed 把 CRLF 转成 LF不然导入后每个字段末尾会带着 \r。如果不想在命令行处理Navicat 导入向导的字符集下拉框选 65001 (UTF-8)但仍要先保证源文件本身是 UTF-8。用 LOAD DATA 导入时记得 CHARACTER SET utf8mb4 和 LINES TERMINATED BY \r\n 要配套写参考 3.3 节。5.4 删除门店失败外键约束 1451 的三种解法现象DELETE FROM store WHERE store_id 3; 报 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails。原因订单表或乐器表里还有 store_id 3 的行物理外键挡着不让删父表。解决有两条路线。路线一先清子表再删父表DELETE FROM order_detail WHERE order_id IN (SELECT order_id FROM sales_order WHERE store_id 3); DELETE FROM sales_order WHERE store_id 3; DELETE FROM store WHERE store_id 3;但历史订单不能删所以路线二更常用加软删除字段不物理删ALTER TABLE store ADD COLUMN deleted TINYINT NOT NULL DEFAULT 0; UPDATE store SET deleted 1 WHERE store_id 3;查询时统一加 WHERE deleted 0。软删除避免了外键冲突也保住了报表维度。注意 store_code 如果加了唯一键软删除后再插入同编码门店会撞唯一键处理办法是删除时把 store_code 加上删除时间戳后缀或把唯一键改成联合唯一键 (store_code, deleted)。5.5 多机同步撞主键UUID、自增偏移与幂等写入现象两家门店数据库同时向中心库同步订单报 Duplicate entry 1 for key PRIMARY。原因两个门店库的自增主键都是从 1 开始各自生成 order_id 1同步到中心库时主键撞车。数据库同步工具只负责搬运数据和表结构不负责解决主键设计问题。解决分三层。第一层业务主键改成 UUID 或雪花 ID自增列只做内部主键业务关联用订单号。第二层用自增偏移把不同门店的主键段错开SET GLOBAL auto_increment_offset 1; SET GLOBAL auto_increment_increment 2;门店 A 用奇数 ID门店 B 用偶数 ID。这招能应急但扩展性差再加第三家门店就得重新设计。第三层写入中心库时用幂等语法重复同步不报错INSERT INTO sales_order (order_no, store_id, order_date, order_status) VALUES (YM20240115001, 3, 2024-01-15, 1) ON DUPLICATE KEY UPDATE order_status VALUES(order_status);前提是 order_no 有唯一键MySQL 8.0.20 之后 VALUES() 语法被标记为弃用新项目建议用别名写法INSERT INTO sales_order (...) VALUES (...) AS new ON DUPLICATE KEY UPDATE order_status new.order_status;异构同步到 Oracle 或达梦时还要处理字段类型映射比如 TINYINT 要映射成 NUMBER(3)DATETIME 映射成 TIMESTAMP这一步在同步前先做字段类型核对别等同步到一半报错再补。6. 最后一步用 information_schema 做结构核对再把连接池参数调对6.1 结构核对用 information_schema 两分钟找出字段差照着 PDF 建完库最怕字段名拼错、字段类型不一致。挨个表看太慢直接查元数据SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA yamaha_business ORDER BY TABLE_NAME, ORDINAL_POSITION;把查询结果导出 CSV和 PDF 里的字段清单做逐列比对。索引也可以这样查SELECT TABLE_NAME, INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS index_columns FROM information_schema.STATISTICS WHERE TABLE_SCHEMA yamaha_business GROUP BY TABLE_NAME, INDEX_NAME;我第一次把这类 PDF 落库时把 instrument 的序列号字段名敲成 instument_seiral上线第二天报表少了几十行查了半天最后就是靠 information_schema 的 COLUMNS 表捞出来的。结构核对要当上线前最后一道工序来走。6.2 连接池参数工程发布时数据库连不上的常见开关库表没问题应用连不上库是另一个高频事故。工程发布时本地跑得好好的、服务器上时不时报 Connection is not available 或者 Communications link failure多半是连接池参数没调对。HikariCP 的常用参数参数推荐值说明maximum-pool-size10 ~ 20并发峰值除以单条 SQL 耗时估算minimum-idle5低峰保留连接避免请求来了现建连connection-timeout30000获取连接超时毫秒数太短容易误报max-lifetime180000030 分钟必须小于数据库 wait_timeoutconnection-test-querySELECT 1借连接前探活Spring Boot 下的配置spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 max-lifetime: 1800000 connection-test-query: SELECT 1max-lifetime 比数据库 wait_timeout 还长会导致数据库端把空闲连接回收了连接池还不知道第二天早上第一波请求全是 link failure。这类问题常被当成网络玄学其实就是生命周期没对齐。连接池参数没有唯一正确答案线上观察峰值等待时间和慢 SQL 再微调比自己拍脑袋设数字可靠。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑