数据库连接池与多数据源管理实战:连接池配置、动态切换、密码加密与故障排查
简介DBserver 24.3.4 是一款面向数据库开发人员与运维人员的图形化数据库连接与管理工具支持 MySQL、PostgreSQL、Oracle、SQL Server 等关系型数据库并可扩展至 MongoDB、Redis 等非关系型系统帮助用户以直观界面完成连接配置、SQL 执行、结构查看与修改、数据导入导出及性能诊断等任务。资源包共 1021 个文件以 375 个 jar、124 个 class、91 个 dll 等运行库与依赖组件为主另含 36 个 html 帮助文档、35 个 properties 配置、29 个 xml 及多份 license 与安全证书文件压缩包约 124.35MB目录结构完整便于直接部署与二次排查。目前已有 3782 人学习下载适合需要跨数据库统一管理、提升日常查询与维护效率的技术人员参考使用。1. 数据库连接工具到底在解决什么问题很多团队都遇到过这种场景开发环境连测试库、测试环境连预发库、预发环境连生产库每换一个环境就要改一次配置文件改完还要担心有没有把生产密码提交到代码仓库。更麻烦的是当数据库从单机 MySQL 扩展到主从集群、分库分表之后连接串的复杂度直线上升一个字符写错就是半小时的排查。DBserver 这类数据库连接工具本质上就是把这些散落在各处的连接信息收拢到一个统一的管理层让应用只关心“我要连哪个逻辑库”而不关心背后是单机还是集群、密码轮换到了第几版。它适合三类人一是需要频繁切换多套环境的后端开发者二是要统一管理几十个实例连接信息的运维人员三是做数据同步或 ETL 时需要在多个数据源之间来回切换的数据工程师。这篇文章不讲空泛概念直接按“连接池怎么配、多数据源怎么切、密码怎么管、出问题怎么查”这条线走一遍每一步都给可复现的命令和参数。2. 连接池选型与最小可用配置2.1 为什么连接池参数比连接串更容易翻车连接串写错报错信息通常很直接比如Access denied或Unknown database看一眼就知道哪里不对。但连接池参数配错表现往往是“跑一会儿就卡死”“压测到 200 并发就开始超时”这种问题排查起来就是玄学。常见做法是先把连接池的四个核心参数定下来最小空闲连接数、最大连接数、获取连接超时时间、空闲连接存活时间。以 Java 生态里最常见的 HikariCP 为例最小空闲连接数建议设为最大连接数的 20% 到 30%不要设成 0否则每次请求都要新建连接数据库那边会看到连接数剧烈抖动。最大连接数不是越大越好一个 4 核 8G 的数据库实例单应用最大连接数超过 50 之后上下文切换的开销会吃掉大部分收益。获取连接超时时间默认 30 秒太长线上建议压到 3 到 5 秒让请求快速失败而不是堆积。空闲连接存活时间要小于数据库服务端的wait_timeout否则会拿到已经被服务端断开的死连接。2.2 用 HikariCP 跑通第一个连接池下面这段配置可以直接抄到一个 Spring Boot 项目的application.yml里改掉地址和账号就能跑。spring: datasource: url: jdbc:mysql://127.0.0.1:3306/demo_db?useSSLfalseserverTimezoneAsia/Shanghai username: demo_user password: demo_pass hikari: minimum-idle: 5 # 最小空闲连接别设 0 maximum-pool-size: 20 # 最大连接数按数据库核数调整 connection-timeout: 3000 # 获取连接超时 3 秒快速失败 idle-timeout: 600000 # 空闲 10 分钟后释放 max-lifetime: 1800000 # 连接最长存活 30 分钟小于服务端 wait_timeout connection-test-query: SELECT 1逻辑说明connection-timeout控制的是从池里拿连接的最长等待时间不是建立 TCP 连接的时间很多人会搞混。max-lifetime必须小于数据库服务端的wait_timeoutMySQL 默认是 28800 秒也就是 8 小时但很多云数据库会改成 600 秒所以这里设 1800 秒是留了余量。connection-test-query在 MySQL 驱动 8.0 以上可以省略驱动会自动用ping检测但如果你用的是老版本驱动保留SELECT 1更稳妥。参数怎么改如果压测时发现获取连接超时频繁出现先把maximum-pool-size往上加 5 再压一次观察数据库的Threads_connected指标。如果数据库连接数已经接近上限但应用还是超时问题就不在池大小而在慢查询占着连接不释放这时候要去查SHOW PROCESSLIST里有没有长时间Sleep或Query状态的连接。2.3 验证连接池是否真的生效配完之后不能只看应用启动成功就完事要实际验证池子在复用连接。连续发 100 个请求然后到数据库上执行SHOW STATUS LIKE Threads_connected; SHOW PROCESSLIST;如果Threads_connected稳定在 20 左右而不是涨到 100说明池化生效了。如果每次请求都新建连接检查一下是不是在代码里手动DriverManager.getConnection了那样会绕过连接池。另一个常见坑是用了Transactional但方法里又开了新线程新线程拿不到事务上下文会从池里另取连接导致连接数翻倍。3. 多数据源动态切换的实现路径3.1 什么时候需要动态数据源什么时候不需要不是所有多库场景都要上动态数据源。如果你的应用只是读写分离用 Spring 的AbstractRoutingDataSource配合注解就够了。但如果你要在一次请求里同时写两个库比如订单库和库存库那就不是简单切换能解决的需要引入分布式事务或者最终一致性方案。动态数据源解决的是“同一个逻辑操作在不同阶段连不同库”的问题比如先查主库确认余额再查从库拉流水这种场景用DS注解切换最轻量。选型上常见做法是用dynamic-datasource-spring-boot-starter它封装了AbstractRoutingDataSource支持注解切换和 SpEL 表达式。另一个选择是自己写一个DataSource路由类好处是可控坏处是要自己处理线程上下文传递和事务同步。我一般会先评估团队规模如果只有两三个库且切换逻辑固定自己写 50 行代码就够了引入额外依赖反而增加排查成本。3.2 用注解方式切换数据源的最小示例假设有两个库order_db和user_db配置如下。spring: datasource: dynamic: primary: order_db datasource: order_db: url: jdbc:mysql://127.0.0.1:3306/order_db username: order_user password: order_pass user_db: url: jdbc:mysql://127.0.0.1:3306/user_db username: user_user password: user_pass然后在 Service 方法上加注解Service public class OrderService { DS(order_db) public Order getOrder(Long id) { // 走 order_db return orderMapper.selectById(id); } DS(user_db) public User getUser(Long id) { // 走 user_db return userMapper.selectById(id); } }逻辑说明DS注解通过 AOP 在方法执行前把数据源 key 塞进ThreadLocalAbstractRoutingDataSource的determineCurrentLookupKey从ThreadLocal里取 key 来决定用哪个数据源。方法执行完后 AOP 会清理ThreadLocal所以不会污染下一个请求。参数上要注意DS可以加在类上也可以加在方法上方法上的优先级更高。如果方法里调用了另一个带DS的方法内层注解不会生效因为 AOP 默认不走自调用代理这是最常见的翻车点。3.3 事务与动态数据源混用的边界动态数据源和Transactional一起用时事务管理器必须和当前数据源绑定。如果在一个事务方法里切换了数据源事务不会跟着切会导致“写到了 A 库但事务回滚的是 B 库”这种严重问题。常见做法是事务方法内不切换数据源切换数据源的方法不加事务或者用Transactional(propagation Propagation.REQUIRES_NEW)显式开新事务。更稳妥的方案是把跨库操作拆成两个独立的事务方法通过上层编排来保证一致性而不是指望一个事务管两个库。验证方法在切换数据源的方法里打印DataSourceContextHolder.getDataSourceKey()确认 key 和预期一致。然后在数据库上开general_log看实际执行的 SQL 落到了哪个实例。如果发现 SQL 跑到了错误的库先检查ThreadLocal有没有被子线程继承InheritableThreadLocal在池化线程里不会传递需要用TransmittableThreadLocal或者手动传递。4. 连接信息加密与密码轮换的落地做法4.1 为什么明文密码放在配置文件里迟早出事配置文件进版本库、日志里打印连接串、运维截图带出密码这三条路径任意一条都能让数据库密码泄露。常见做法是把密码从配置文件里抽出来放到环境变量或者配置中心但环境变量在ps命令下也可能被看到配置中心则要解决启动时拉取失败的问题。更完整的方案是配置文件里只放密文应用启动时用密钥解密密钥本身通过启动参数或宿主机文件注入不进版本库。选型上Jasypt 是 Spring Boot 生态里最省事的加密方案它支持ENC()占位符和Value无缝集成。如果团队已经有配置中心比如 Nacos 或 Apollo直接用它们的加密配置功能更合适因为密钥管理可以交给配置中心统一做。自己写 AES 加解密也不是不行但要处理好 IV 和密钥派生否则容易踩到“加密后每次结果不一样”或者“密钥硬编码在代码里”的坑。4.2 用 Jasypt 加密数据库密码的完整步骤第一步引入依赖dependency groupIdcom.github.ulisesbocchio/groupId artifactIdjasypt-spring-boot-starter/artifactId version3.0.5/version /dependency第二步用命令行工具生成密文java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ inputdemo_pass \ passwordmaster_key_2024 \ algorithmPBEWithMD5AndDES输出里会有一行ENC(密文)把它填到配置文件spring: datasource: password: ENC(3f2a9c1b7e4d8a6f0c5b2e9d1a7f4c8b) jasypt: encryptor: password: ${JASYPT_MASTER_KEY}逻辑说明input是原始密码password是主密钥algorithm指定加密算法。主密钥不能写在配置文件里要通过环境变量JASYPT_MASTER_KEY注入。启动时 Jasypt 会自动解密ENC()包裹的内容应用拿到的就是明文密码。参数上要注意PBEWithMD5AndDES是默认算法安全性一般生产环境建议换成PBEWITHHMACSHA512ANDAES_256但需要额外引入jasypt-spring-boot-starter的对应版本支持。4.3 密码轮换时怎么避免应用重启密码轮换的难点在于数据库改密码的瞬间旧连接池里的连接会全部失效新连接用新密码才能建立。如果应用不重启池子里的旧连接会一直报Access denied。常见做法是分两步先在数据库上创建新密码的用户让应用同时支持新旧两套密码然后滚动重启应用最后删掉旧密码用户。如果不想重启可以用连接池的动态刷新功能HikariCP 支持通过HikariConfigMXBean在运行时修改username和password改完之后池子会逐步用新密码重建连接。验证方法改完密码后在应用里执行一次SELECT 1然后看数据库的general_log里有没有Access denied记录。如果还有旧连接在用旧密码说明池子没有完全刷新需要手动调用evictConnection或者等max-lifetime到期。更稳妥的做法是在低峰期做轮换并且提前把max-lifetime调小比如改成 300 秒让旧连接快速淘汰。5. 连接工具常见问题与排查清单5.1 连接数暴涨但业务量没变现象数据库Threads_connected从 20 涨到 200应用响应变慢但 QPS 没有明显变化。原因最常见的是代码里手动创建了连接没有关闭比如用了DriverManager.getConnection之后忘了close()。另一个可能是连接池的leak-detection-threshold没开泄漏的连接一直占着不释放。还有一种情况是应用开了很多线程每个线程都从池里拿连接但不归还比如在Async方法里做数据库操作但没有配事务。解决先开 HikariCP 的泄漏检测把leak-detection-threshold设成 5000 毫秒日志里会打印出泄漏连接的堆栈。然后检查代码里有没有Connection、Statement、ResultSet没有在finally块里关闭。如果是线程池导致的把数据库操作收拢到固定大小的线程池里并且给线程池配好拒绝策略避免无限创建线程。5.2 动态数据源切换不生效现象加了DS注解但 SQL 还是跑到了默认库。原因自调用导致 AOP 失效是最常见的比如在同一个类里方法 A 调用方法 B方法 B 上的DS不会生效。另一个原因是DS加在了 private 方法上Spring AOP 基于代理private 方法不会被代理。还有可能是ThreadLocal被子线程覆盖了比如在方法里开了新线程新线程里的数据源 key 是空的会走默认库。解决把带DS的方法拆到另一个 Bean 里通过注入的方式调用。检查方法是不是 public 的。如果用了线程池在提交任务前手动把数据源 key 传进去或者用TransmittableThreadLocal替换默认的ThreadLocal。验证时可以在determineCurrentLookupKey里打日志看每次切换时 key 是什么。5.3 连接池启动时报“Too many connections”现象应用启动时直接报Too many connections数据库连接数被打满。原因maximum-pool-size设得太大比如设了 200而数据库的max_connections只有 100。另一个可能是多个应用实例同时启动每个实例都按最大连接数去建连加起来超过了数据库上限。还有一种情况是连接池初始化时一次性建了minimum-idle个连接如果minimum-idle设得和maximum-pool-size一样大启动瞬间就会建满。解决把maximum-pool-size降到数据库max_connections的 70% 以下再除以应用实例数。minimum-idle设成maximum-pool-size的 20% 到 30%。如果数据库是云服务先确认它的连接数上限是多少很多入门级实例只给 50 个连接。启动时如果还是报错把initialization-fail-timeout设成 -1让应用先启动连接池在后台慢慢建连。5.4 空闲一段时间后第一个请求总是超时现象应用闲置半小时后第一个请求必然超时后面就正常了。原因数据库服务端的wait_timeout到了把空闲连接断开了但连接池不知道还拿着死连接去用。第一个请求拿到死连接后报错连接池把它剔除第二个请求才拿到新连接。如果max-lifetime大于wait_timeout这个问题会反复出现。解决把max-lifetime设成小于wait_timeout比如wait_timeout是 600 秒max-lifetime就设 300 秒。同时把idle-timeout也调小让空闲连接主动释放。如果数据库是 MySQL可以在连接串里加autoReconnecttrue但这不是根本办法因为autoReconnect在事务中会失效。更稳妥的是开connection-test-query或者用驱动的ping机制在拿连接时先检测一下。5.5 加密后的密码在容器里解密失败现象本地跑得好好的一上容器就报DecryptionException。原因主密钥通过环境变量注入但容器编排文件里环境变量的写法不对比如用了$JASYPT_MASTER_KEY但变量没定义或者变量名拼写错了。另一个可能是容器里的 JVM 参数没有把jasypt.encryptor.password传进去导致 Jasypt 用了默认的空密码。解决在容器启动脚本里先echo $JASYPT_MASTER_KEY确认变量有值。如果是 Kubernetes检查env字段有没有引用正确的 Secret。Jasypt 的密码可以通过-Djasypt.encryptor.passwordxxx传给 JVM也可以走环境变量JASYPT_ENCRYPTOR_PASSWORD但要注意 Spring Boot 的宽松绑定规则环境变量名要全大写加下划线。验证时可以在启动类里打印System.getenv(JASYPT_MASTER_KEY)的长度确认不是 null。6. 用连接池指标做容量规划的一个具体技巧连接池的指标不只是用来排查故障还可以用来做容量规划。HikariCP 暴露了hikaricp.connections.active、hikaricp.connections.idle、hikaricp.connections.pending这几个指标通过 Micrometer 可以打到 Prometheus 上。我一般会盯pending这个指标它表示有多少线程在等连接。如果pending长期大于 0说明池子太小或者连接被慢查询占着。如果pending一直是 0 但active接近maximum-pool-size说明池子够用但余量不多可以考虑加 2 到 3 个连接做缓冲。具体做法是在 Spring Boot 里加依赖dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependency然后在application.yml里开端点management: endpoints: web: exposure: include: health,metrics,prometheus metrics: tags: application: ${spring.application.name}逻辑说明management.endpoints.web.exposure.include把 Prometheus 端点暴露出来Micrometer 会自动把 HikariCP 的指标注册进去。指标名里会带连接池的名字默认是HikariPool-1可以在配置里改成有意义的名称比如order-db-pool。参数上要注意metrics.tags.application会加到所有指标上方便在 Grafana 里按应用筛选。拿到指标后用下面这个 PromQL 算连接池的饱和度hikaricp_connections_active{poolorder-db-pool} / hikaricp_connections_max{poolorder-db-pool}如果这个比值持续超过 0.8就该考虑扩容了。扩容不一定是加连接数也可能是加数据库从库或者优化慢查询。我自己的习惯是每周看一眼这个比值的 95 分位如果比上周高了 10% 以上就去查一下有没有新上线的慢 SQL。这个习惯帮我提前发现过好几次索引缺失的问题比等用户投诉再查要主动得多。还有一个细节hikaricp_connections_pending的告警阈值不要设成 0因为偶尔的毛刺是正常的。我一般设成“持续 1 分钟大于 5”才告警这样能过滤掉压测或批量任务带来的瞬时波动。如果告警真的响了先看active是不是也满了如果active没满但pending高那可能是获取连接的超时时间设得太短线程还没来得及拿到连接就超时了。最后说一个我踩过的坑有一次把maximum-pool-size从 20 调到 50以为能扛住更高的并发结果数据库的 CPU 反而从 40% 涨到了 80%响应时间还变长了。后来查出来是连接数多了之后MySQL 的锁竞争和上下文切换开销上来了。所以连接数不是越多越好找到那个“刚好够用”的点比盲目加连接更重要。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

RAG系统全链路观测实战:LangSmith接入与排查指南

RAG系统全链路观测实战:LangSmith接入与排查指南

1. 为什么 RAG 系统需要一台“心电监护仪”做过 RAG 应用的人大概都有过这种体验:用户反馈“答得不对”,你打开日志一看,检索回来的文档片段看起来没问题,生成模型也没报错,但最终答案就是跑偏了。更让人头疼的是&…

2026/10/12 18:08:45 阅读更多 →
开放式代码评审框架:从粒度控制到文化落地的完整实践指南

开放式代码评审框架:从粒度控制到文化落地的完整实践指南

1. 从“代码评审”这件事说起:为什么我们需要一个开放式的评审框架代码评审这件事,做过开发的人都不陌生。不管你是刚入行的新手,还是带了几年团队的老手,只要涉及到多人协作,代码评审就是绕不过去的一道坎。但现实情况…

2026/10/12 18:07:44 阅读更多 →
开放代码评审实战:从流程设计到工具链选型

开放代码评审实战:从流程设计到工具链选型

1. 从“代码评审”到“开放评审”:一个被低估的工程实践第一次看到“open-code-review”这个标题,我脑子里蹦出来的不是某个具体工具,而是一种工作方式的转变。过去几年里,我参与过不少团队的代码评审流程搭建,从最初几…

2026/10/12 18:07:44 阅读更多 →

最新新闻

C++ YOLO ONNX 部署:OpenCV dnn 推理与后处理实战

C++ YOLO ONNX 部署:OpenCV dnn 推理与后处理实战

简介:这份资源面向具备一定C基础、希望将YOLO目标检测模型落地到实际工程中的开发者,聚焦于使用OpenCV的dnn模块加载并运行ONNX格式的YOLO模型,解决从模型文件到可执行推理代码的部署问题。压缩包共2个文件,包含1个cpp源文件与1个…

2026/10/12 19:30:13 阅读更多 →
A股情绪指标构建全链路:从评论到可回测时间序列

A股情绪指标构建全链路:从评论到可回测时间序列

简介:本资源是一套基于Python实现的股市市场情绪分析完整项目,面向金融数据分析初学者、量化投资爱好者及NLP实践者,旨在通过挖掘股评文本情绪辅助投资决策,在A股非有效市场中构建可解释的情绪指标。压缩包共15个文件,…

2026/10/12 19:30:13 阅读更多 →
丑数动态规划详解:从判断到生成,三指针多路归并吃透经典题

丑数动态规划详解:从判断到生成,三指针多路归并吃透经典题

丑数1和2,是动态规划里一对特别适合放在一起练的题。别被名字误导,丑数和“长得丑”没关系,算法里它是正经数学名词:只包含质因数2、3、5的正整数,并且大家约定1也算丑数。题目通常有两个版本,第一个版本让…

2026/10/12 19:30:13 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到远程控制与问题排查

ESP32舵机控制全攻略:从PWM原理到远程控制与问题排查

1. 项目概述:为什么ESP32是舵机控制的“理想平台”做机器人、机械臂、云台或者模型车改造的朋友,迟早都会遇到一个绕不开的节点:怎么让舵机按照自己的想法动起来。以前大家习惯用Arduino Uno或者树莓派来做这件事,但有几个痛点一直…

2026/10/12 19:30:13 阅读更多 →
海思MPP中文字模显示原理与OSD区域管理实战

海思MPP中文字模显示原理与OSD区域管理实战

1. 为什么海思MPP里的区域管理不是“画个框”那么简单在做海思平台视频处理项目时,我第一次接到需求:“在画面右上角加个中文时间水印,字体要清晰,不能模糊,还要支持换行”。听起来就是调个API、填个字符串的事。结果整…

2026/10/12 19:30:13 阅读更多 →
89C52单片机驱动旋转LED的POV显示原理与实战

89C52单片机驱动旋转LED的POV显示原理与实战

1. 项目概述:为什么旋转LED至今仍是单片机入门的“试金石”你有没有在科技展会、校园创新实验室,甚至某家咖啡馆的角落里,见过那种悬空漂浮、自带呼吸感的LED文字?它没有屏幕,却能清晰显示“HELLO”“2024”甚至简单动…

2026/10/12 19:29:10 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →