当前位置: 首页 > news >正文

南大通用数据库-Gbase-8a-学习-42-定位与释放锁

目录

一、测试版本

二、模拟锁表场景

1、查看自动提交参数

2、关闭自动提交

3、测试表结构

4、测试数据

5、会话一更新数据不提交

6、会话二更新数据卡住

7、会话三查看连接信息

8、会话三查看锁信息

9、解决方法

10、会话一插入数据不提交

11、会话二更新报错

三、总结


一、测试版本

名称
CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
操作系统CentOS Linux release 7.9.2009 (Core)
内存3G
逻辑核数2
Gbase8a版本8.6.2-R43

二、模拟锁表场景

打开三个会话。

1、查看自动提交参数

gbase> show variables like'%commit%';
+-----------------------------------------------------------+----------+
| Variable_name                                             | Value    |
+-----------------------------------------------------------+----------+
| _t_gcluster_commit_revert_flag_test                       | 1        |
| autocommit                                                | ON       |
| gbase_tcmalloc_aggressive_decommit_threadhold_load_factor | 0.900000 |
| gbase_tcmalloc_balanced_decommit_threadhold_load_factor   | 0.600000 |
| gcluster_kafka_batch_commit_dml_count                     | 100000   |
| gcluster_kafka_parallel_commit                            | 1        |
+-----------------------------------------------------------+----------+
6 rows in set (Elapsed: 00:00:00.00)

2、关闭自动提交

gbase> set autocommit = 0;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

前两个会话设置非自动提交。

3、测试表结构

gbase> desc czg.testtab;
+-------+---------------+------+-----+-------------------+-----------------------------+
| Field | Type          | Null | Key | Default           | Extra                       |
+-------+---------------+------+-----+-------------------+-----------------------------+
| a     | int(11)       | YES  |     | NULL              |                             |
| b     | double        | YES  |     | NULL              |                             |
| c     | varchar(100)  | YES  | MUL | NULL              |                             |
| d     | text          | YES  |     | NULL              |                             |
| e     | blob          | YES  |     | NULL              |                             |
| f     | longblob      | YES  |     | NULL              |                             |
| g     | date          | YES  |     | NULL              |                             |
| h     | timestamp     | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| i     | decimal(10,2) | YES  |     | NULL              |                             |
+-------+---------------+------+-----+-------------------+-----------------------------+
9 rows in set (Elapsed: 00:00:00.05)

4、测试数据

gbase> select * from czg.testtab limit 10;
+------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
| a    | b    | c    | d                  | e                   | f                        | g          | h                   | i    |
+------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
|    1 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
|    1 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
|    1 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
|    1 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
|    1 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.00 |
|    2 |  1.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 2.00 |
|    2 |  4.1 | czg  | 快乐的小天使       | qwertasdsdfzxczxxv  | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
|    2 |  4.1 | czg  | 快乐的小天使       | qwertasdsdfz\xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
|    2 |  4.1 | czg  | 快乐的小天使       | qwertasdsdfz.xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
|    2 |  4.1 | czg  | 快乐的小天使       | qwertasdsdfz.xczxxv | gregergjsfishfuieehfuiew | 1995-09-18 | 2022-08-03 09:24:00 | 1.10 |
+------+------+------+--------------------+---------------------+--------------------------+------------+---------------------+------+
10 rows in set (Elapsed: 00:00:02.51)

5、会话一更新数据不提交

gbase> update czg.testtab set d = 'JJLGG' where a = 2;Query OK, 1310720 rows affected (Elapsed: 03:28:21.03)
Rows matched: 1310720  Changed: 1310720  Warnings: 0

6、会话二更新数据卡住

gbase> update czg.testtab set d = 'HappySunshine' where a = 1;

我们更新的是不同的行,却锁住了,说明Gbase8a不支持行锁,这里加的是表锁。

7、会话三查看连接信息

[gbase@czg2 ~]$ gccli -e "show detail processlist;"
+-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+
| Id  | Tid   | User            | Host                 | db                 | Command | Time   | State                       | Lock                                                                                                                                                | Wait                                            | Info                                                   |
+-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+
|   1 |  5752 | event_scheduler | localhost            | NULL               | Daemon  |  80337 | Waiting for next activation | NULL                                                                                                                                                | NULL                                            | NULL                                                   |
| 276 | 78263 | root            | localhost            | NULL               | Sleep   | 172223 |                             | NULL                                                                                                                                                | NULL                                            | NULL                                                   |
| 277 | 78372 | root            | 192.168.142.12:35329 | zxj                | Sleep   | 172223 |                             | NULL                                                                                                                                                | NULL                                            | NULL                                                   |
| 585 | 94012 | root            | localhost            | information_schema | Query   |    205 | checking permissions        | czg                                                                                                                                                 | czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739 | update czg.testtab set d = 'HappySunshine' where a = 1 |
| 589 | 95886 | root            | localhost            | NULL               | Sleep   |  19292 |                             | czg;czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739;czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA;czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3 | NULL                                            | NULL                                                   |
| 642 |  2049 | root            | localhost            | NULL               | Query   |      0 | NULL                        | NULL                                                                                                                                                | NULL                                            | show detail processlist                                |
+-----+-------+-----------------+----------------------+--------------------+---------+--------+-----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------+--------------------------------------------------------+

这些字段的含义为:

字段描述
Id连接编号。
Tid线程号。
User登录数据库用户。
Host连接源端的ip和端口。
db连接的数据库。
Command当前执行的命令。
Time上面命令执行的时间。(单位:秒)
StateSQL的运行状态。
Lock持有的锁。
Wait等待的锁。
Info执行的SQL语句。

我们主要看589和585。

585的State:checking permissions,表示在检查权限。Wait:czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739,表示等待锁czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739。

589的Lock:czg;czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739;czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA;czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3,表示持有锁:

(1)czg

(2)czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739(和585等待的锁一样)

(3)czg.testtab580D5F90-B287-4199-B057-E6FBD44B5BFA

(4)czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3

说明589一直占有锁,未释放,导致585一直等待。再看589的Command:Sleep,表示为空闲状态。那我们可以断定是589没有执行提交操作,导致的锁等待。如果589是Query,那就有可能是执行慢,导致其他会话卡住。具体情况具体分析吧。

8、会话三查看锁信息

[gbase@czg2 ~]$ gcadmin showlock+========================================================================================================================+|                                                     GCLUSTER LOCK                                                      |+========================================================================================================================++-----------------------------------------------+--------------+------------------------------+--------------+------+----+|                   Lock name                   |    owner     |           content            | create time  |orphan|type|+-----------------------------------------------+--------------+------------------------------+--------------+------+----+|                      czg                      |192.168.142.12|LOCK_Reserved: 589(LWP:95886) |20231109105742|FALSE | S  |+-----------------------------------------------+--------------+------------------------------+--------------+------+----+|                      czg                      |192.168.142.12|LOCK_Reserved: 585(LWP:94012) |20231109161549|FALSE | S  |+-----------------------------------------------+--------------+------------------------------+--------------+------+----+|czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739|192.168.142.12|LOCK_Rebalance: 589(LWP:95886)|20231109142557|FALSE | E  |+-----------------------------------------------+--------------+------------------------------+--------------+------+----+|czg.testtab580d5f90-b287-4199-b057-e6fbd44b5bfa|192.168.142.12|  LOCK_DMLEX: 589(LWP:95886)  |20231109142557|FALSE | E  |+-----------------------------------------------+--------------+------------------------------+--------------+------+----+|czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3|192.168.142.12|  LOCK_DMLEX: 589(LWP:95886)  |20231109142557|FALSE | E  |+-----------------------------------------------+--------------+------------------------------+--------------+------+----+Total : 5
参数描述
Lock name锁的名称。
owner持有锁的节点IP。
content第一个数字是Id连接编号。
第二个数字是线程号。
create time锁创建日期。
orphan是否为孤儿锁。
typeS:共享锁。E:排他锁。

9、解决方法

(1)方法一:589对应的会话进行提交。

(2)方法二:开一个新会话kill 589。

(3)方法三:通过官方的python gcware接口去释放。

查看锁demo

#encoding:utf-8
import gcwareSUCCESS_FLAG = 1
FAIL_FLAG    = 0def ReleaseLock(TableName, LockId):if gcware.unlocktableforce(TableName,LockId) != 0:print("ReleaseLock : OK, TableName : %s, LockId : %s"%(TableName,LockId))return SUCCESS_FLAGelse:print("ReleaseLock : Fail, TableName : %s, LockId : %s"%(TableName,LockId))return FAIL_FLAGif __name__ == '__main__':for i in gcware.getlocks():for j in i:print("%-20s : %s"%(j,i[j]))print("=========================")

TableName就是下面的name,LockId就是下面的lockid。大家可以自己调用ReleaseLock尝试释放锁,建议大家不要用gcware接口。

运行效果

create time          : 20231109105742
name                 : czg
lockid               : 9114802754034860036
orphan               : FALSE
content              : LOCK_Reserved: 589(LWP:95886)
owner                : 192.168.142.12
type                 : SHARE
=========================
create time          : 20231109161549
name                 : czg
lockid               : 171802565900500995
orphan               : FALSE
content              : LOCK_Reserved: 585(LWP:94012)
owner                : 192.168.142.12
type                 : SHARE
=========================
create time          : 20231109142557
name                 : czg.testtab02076d53-3c94-4aa4-b020-b9df0c802739
lockid               : 8869015163097841664
orphan               : FALSE
content              : LOCK_Rebalance: 589(LWP:95886)
owner                : 192.168.142.12
type                 : EXCLUSIVE
=========================
create time          : 20231109142557
name                 : czg.testtab580d5f90-b287-4199-b057-e6fbd44b5bfa
lockid               : 2937847747467804673
orphan               : FALSE
content              : LOCK_DMLEX: 589(LWP:95886)
owner                : 192.168.142.12
type                 : EXCLUSIVE
=========================
create time          : 20231109142557
name                 : czg.testtab6ef6f8a9-87f0-4d6c-8043-899367d02df3
lockid               : 6284283086788100098
orphan               : FALSE
content              : LOCK_DMLEX: 589(LWP:95886)
owner                : 192.168.142.12
type                 : EXCLUSIVE
=========================

10、会话一插入数据不提交

gbase> insert into czg.testtab values(1,1.1,'asdasd','zxj','dfd','asd','1995-09-18','2023-08-03 09:24:00',1.00);
Query OK, 1 row affected (Elapsed: 00:00:00.14)

11、会话二更新报错

gbase> update czg.testtab set d = 'JJLGG' where a = 2;
ERROR 1727 (HY000): try to lock in gcluster failed: (GBA-02LO-0002) Can't lock file(already exists).

三、总结

序号描述
1Gbase8a锁支持粒度为表级。
2并发更新或删除同一张表时,其中一个会话执行较慢,导致其他会话等待。
3会话一更新或删除A表,会话二插入A表,无论会话一二的执行顺序,都会提示报错:ERROR 1727 (HY000): try to lock in gcluster failed: (GBA-02LO-0002) Can't lock file(already exists).。

相关文章:

南大通用数据库-Gbase-8a-学习-42-定位与释放锁

目录 一、测试版本 二、模拟锁表场景 1、查看自动提交参数 2、关闭自动提交 3、测试表结构 4、测试数据 5、会话一更新数据不提交 6、会话二更新数据卡住 7、会话三查看连接信息 8、会话三查看锁信息 9、解决方法 10、会话一插入数据不提交 11、会话二更新报错 三…...

css绘制常见的一些图形

以下是在CSS中绘制常见图形的示例代码: 线条: .line {width: 100px;height: 1px;background-color: black; }箭头: .arrow {width: 0;height: 0;border-top: 10px solid transparent;border-bottom: 10px solid transparent;border-right:…...

【网络协议】

网络协议 1 网络通讯1.1 防火墙1.2 子网掩码1.3 网关1.4 2 SSH2.1 SSH2.2 SSH12.3 SSH2 3 Telnet4 Telnet/SSL5 NFS6 TFTP7 FTP8 SFTP9 HTTP10 HTTPS11 NAT12 加密 1 网络通讯 1.1 防火墙 所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法&…...

如何在JVS低代码表单配置中实现数据的高效管理?

在数字化时代,表单已经成为企业、机构和个人收集、整理、分析数据的重要工具。然而,随着数据复杂性的增长,传统的单一表单往往难以满足需求。JVS低代码表单引擎中子表格允许在主表单中嵌套另一个子表数据,使得数据的收集和组织更加…...

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…...

Android超简单的显示网络图片方法

Android显示网络图片的方法如下&#xff1a; 1、首先&#xff0c;需要在AndroidManifest.xml文件中添加网络权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 2、在布局文件中添加ImageView控件&#xff1a; <ImageVie…...

基于自然语言处理的结构化数据库问答机器人系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 知识库&#xff0c;就是人们总结出的一些历史知识的集合&#xff0c;存储、索引以后&#xff0c;可以被方便的检索出来供后人查询/学习。QnA Maker是用于建立知识库的工具&#xff0c;使用…...

JVM Native内存泄露的排查分析(64M 问题)

我们有一个线上的项目&#xff0c;刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G&#xff0c;这明显不合理&#xff0c;于是进行了一些分析找到了根本的原因&#xff0c;下面是完整的分析过程&#xff0c;希望对你有所帮助。 会涉及到下面这些内容 Linux 经典的 64M…...

智能网联汽车基础软件信息安全需求分析

目录 1.安全启动 2.安全升级 3.安全存储 4.安全通信 5.安全调试 6.安全诊断 7.小结 1.安全启动 对于MCU&#xff0c;安全启动主要是以安全岛BootROM为信任根&#xff0c;在MCU启动后&#xff0c;用户程序运行前&#xff0c;硬件加密模块采用逐级校验、并行校验或者混合校…...

《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent

1、界面标题栏事件&#xff1a; NonClientAreaMouseButtonPress 标题栏点击事件 NonClientAreaMouseButtonRelease 标题栏释放事件 bool CustomPopDialog::event(QEvent* event) {switch (event->type()){case QEvent::MouseButtonRelease://Event of mouse releasing wind…...

CSDN中调整图片和文本样式

1.调整图片比例 插入图片后&#xff0c;觉得图片比例不协调&#xff0c;想改小点。只需要在文件后缀加个参数即可&#xff1a;?pic_center 60x。 NOTE&#xff1a;等号左边一定要加个空格&#xff0c;否则格式不生效 2.修改字体颜色 如上 NOTE&#xff1a;等号左边一定要…...

社区团购商品数据抓取

爬虫程序的实现需要使用到C#编程语言以及相关爬虫框架&#xff0c;如Scrapy、WebScraper等。以下是一个简单的示例&#xff0c;展示了如何使用C#爬取网站上的商品数据&#xff1a; using System; using System.Net; using System.IO; using HtmlAgilityPack;class Program {st…...

Nginx用做sip代理

https://www.jianshu.com/p/14d134cbf8d3?tdsourcetags_pcqq_aiomsg 看了这篇文章的方案一&#xff0c;我专门试了试&#xff0c;记录如下&#xff1a; 测试环境为&#xff1a; fs1&#xff08;5080 --- nginx --- fs2&#xff08;5060&#xff09; 局域网同一个网段&…...

C# set的一些使用方法

在C#应用中&#xff0c;使用set监控值的改变触发事件是一种非常常见的编程模式。 比如下面一些应用。 1、属性更改通知&#xff1a;当某个属性的值发生变化时&#xff0c;可以使用set监控属性的改变&#xff0c;并触发一个事件来通知其他部分代码。这在MVVM&#xff08;Model…...

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…...

JAVA代码视频转GIF(亲测有效)

1.说明 本次使用的是JAVA代码视频转GIF&#xff0c;maven如下&#xff1a; <dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.2.0</version></dependency><dependency&…...

挑战100天 AI In LeetCode Day03(热题+面试经典150题)

挑战100天 AI In LeetCode Day03&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-52.1 题目2.2 题解 三、面试经典 150 题-53.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…...

【手写模拟Spring底层原理】

文章目录 模拟Spring底层详解1、结合配置类&#xff0c;扫描类资源1.1、创建需要扫描的配置类AppConfig&#xff0c;如下&#xff1a;1.2、创建Spring容器对象LyfApplicationContext&#xff0c;如下1.3、Spring容器对象LyfApplicationContext扫描资源 2、结合上一步的扫描&…...

代码随想录训练营Day1:二分查找与移除元素

本专栏内容为&#xff1a;代码随想录训练营学习专栏&#xff0c;用于记录训练营的学习经验分享与总结。 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;二分查找与移除元素 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a…...

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测 目录 回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现PCA-PLS主成分降维结合偏小二乘回归预测&#xff08;完整源码和数据) 1.输…...

别再只用jstack了!JDK自带的JMC(Java Mission Control)实战:5分钟搞定线上应用性能监控与JFR分析

别再只用jstack了&#xff01;JDK自带的JMC实战&#xff1a;5分钟搞定线上性能监控与JFR分析 当线上Java应用突然出现CPU飙高、内存泄漏或频繁GC时&#xff0c;大多数开发者的第一反应是打开终端输入jstack。但面对生产环境复杂的性能问题&#xff0c;仅靠线程快照就像用听诊器…...

你的 Tree Shaking 可能是“假的”?

你以为你用了 ES Module&#xff0c;就自动开启 Tree Shaking 了&#xff1f; 很遗憾&#xff0c;大多数情况下——并没有真正生效。很多项目打包后&#xff1a; 明明没用的代码还在bundle 体积异常膨胀优化了半天效果不明显 问题很可能出在一个你没注意的地方&#xff1a; pac…...

Windows程序完全隐藏运行:专业级后台进程管理终极解决方案

Windows程序完全隐藏运行&#xff1a;专业级后台进程管理终极解决方案 【免费下载链接】RunHiddenConsole Hide console window for windows programs 项目地址: https://gitcode.com/gh_mirrors/ru/RunHiddenConsole 在Windows系统自动化工作中&#xff0c;你是否经常被…...

分光计实验:从原理到实践,手把手教你测量三棱镜折射率

1. 分光计实验入门&#xff1a;为什么测量三棱镜折射率这么重要&#xff1f; 第一次接触分光计实验时&#xff0c;我和大多数同学一样满头雾水——这个长得像显微镜的金属仪器&#xff0c;怎么会有二十多个调节旋钮&#xff1f;直到亲手完成三棱镜折射率测量&#xff0c;才明白…...

ABAQUS盾构管片:单环多环精细化建模CAE源文件及录屏讲解教程 ‘一环六块,环宽1.5m...

ABAQUS盾构管片精细化建模cae源文件及录屏讲解教程 包含单环和多环两种 一环6块&#xff0c;环宽1.5m&#xff0c;管片厚度350mm 可以进行计算最近在搞盾构隧道数值模拟&#xff0c;发现管片建模真是个体力活。今天就拿ABAQUS实操经验来说说&#xff0c;怎么快速搞定精细化建模…...

别再拍脑袋做决定了!用Excel手把手教你搞定AHP层次分析法(附一致性检验避坑指南)

Excel实战&#xff1a;用AHP层次分析法科学决策&#xff08;附一致性检验全流程&#xff09; 决策是职场中最常见的挑战之一——从供应商筛选到项目优先级排序&#xff0c;从人才评估到个人职业规划&#xff0c;我们总在多个选项中反复权衡。传统拍脑袋决策方式往往导致"选…...

从阿克曼角异响到安全转弯:冬季用车与直角转弯的完整指南

从阿克曼角异响到安全转弯&#xff1a;冬季用车与直角转弯的完整指南 清晨启动车辆时&#xff0c;方向盘转动到一定角度突然传来"噔噔"异响&#xff0c;伴随轻微震动——这个困扰许多车主的冬季常见现象&#xff0c;背后隐藏着汽车工程学的精妙设计。阿克曼角&#x…...

别再乱叠层了!四层、六层、八层PCB板分层实战指南(附Altium Designer设置要点)

多层PCB设计实战&#xff1a;从四层到八层的叠层策略与Altium Designer实现 在高速数字电路和射频系统设计中&#xff0c;PCB叠层结构的选择直接影响信号完整性、电源分配和电磁兼容性。许多工程师在面对四层、六层和八层板设计时&#xff0c;常常陷入"层数越多越好"…...

给ESP8266智能时钟加个‘离线记忆’:断网后如何用ArduinoJson缓存天气数据?

ESP8266智能时钟的离线生存指南&#xff1a;用ArduinoJson实现数据持久化 当WiFi信号突然消失&#xff0c;你的智能时钟是否变成了"智障"时钟&#xff1f;这个问题困扰着许多物联网开发者。本文将带你深入探索如何为ESP8266智能时钟打造可靠的离线数据缓存系统&#…...

Ink性能优化终极指南:10个技巧打造闪电般快速命令行应用

Ink性能优化终极指南&#xff1a;10个技巧打造闪电般快速命令行应用 【免费下载链接】ink &#x1f308; React for interactive command-line apps 项目地址: https://gitcode.com/GitHub_Trending/in/ink Ink是一个基于React的命令行应用开发框架&#xff0c;让开发者…...