MySQL数据库连接超时问题排查报告
1、问题描述
边端设备访问云端过程中有概率出现MySQL数据库连接超时报错,具体报错代码如下:
[2024-08-13 13:47:44,036] ERROR in app: Exception on /est-tasks/start [POST] Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1971, in _exec_single_context self.dialect.do_execute( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 919, in do_execute cursor.execute(statement, parameters) File "/usr/local/lib/python3.10/site-packages/pymysql/cursors.py", line 153, in execute result = self._query(query) File "/usr/local/lib/python3.10/site-packages/pymysql/cursors.py", line 322, in _query conn.query(q) File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 558, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 822, in _read_query_result result.read() File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 1200, in read first_packet = self.connection._read_packet() File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 748, in _read_packet raise err.OperationalError( pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1463, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 872, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 870, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 855, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] File "/flask/app/api/est_task.py", line 99, in send_test_start RequestDao().create([request_record]) File "/flask/app/dao/base_dao.py", line 268, in create model = schema.load(obj, partial=True) File "/usr/local/lib/python3.10/site-packages/marshmallow_sqlalchemy/load_instance_mixin.py", line 100, in load return super().load(data, **kwargs) File "/usr/local/lib/python3.10/site-packages/marshmallow/schema.py", line 722, in load return self._do_load( File "/usr/local/lib/python3.10/site-packages/marshmallow/schema.py", line 897, in _do_load result = self._invoke_load_processors( File "/usr/local/lib/python3.10/site-packages/marshmallow/schema.py", line 1095, in _invoke_load_processors data = self._invoke_processors( File "/usr/local/lib/python3.10/site-packages/marshmallow/schema.py", line 1225, in _invoke_processors data = processor(data, many=many, **kwargs) File "/usr/local/lib/python3.10/site-packages/marshmallow_sqlalchemy/load_instance_mixin.py", line 76, in make_instance instance = self.instance or self.get_instance(data) File "/usr/local/lib/python3.10/site-packages/marshmallow_sqlalchemy/load_instance_mixin.py", line 60, in get_instance return self.session.get(self.opts.model, filters) File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/scoping.py", line 1060, in get return self._proxied.get( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3637, in get return self._get_impl( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 3817, in _get_impl return db_load_fn( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 694, in load_on_pk_identity session.execute( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2306, in execute return self._execute_internal( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2191, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 293, in orm_execute_statement result = conn.execute( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1422, in execute return meth( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 514, in _execute_on_connection return connection._execute_clauseelement( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1644, in _execute_clauseelement ret = self._execute_context( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1850, in _execute_context return self._exec_single_context( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1990, in _exec_single_context self._handle_dbapi_exception( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2357, in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1971, in _exec_single_context self.dialect.do_execute( File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 919, in do_execute cursor.execute(statement, parameters) File "/usr/local/lib/python3.10/site-packages/pymysql/cursors.py", line 153, in execute result = self._query(query) File "/usr/local/lib/python3.10/site-packages/pymysql/cursors.py", line 322, in _query conn.query(q) File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 558, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 822, in _read_query_result result.read() File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 1200, in read first_packet = self.connection._read_packet() File "/usr/local/lib/python3.10/site-packages/pymysql/connections.py", line 748, in _read_packet raise err.OperationalError( sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: SELECT core_device_request.device_number AS core_device_request_device_number, core_device_request.request_id AS core_device_request_request_id, core_device_request.request_type AS core_device_request_request_type, core_device_request.start_time AS core_device_request_start_time, core_device_request.end_time AS core_device_request_end_time, core_device_request.state AS core_device_request_state, core_device_request.created_at AS core_device_request_created_at, core_device_request.created_by AS core_device_request_created_by, core_device_request.updated_at AS core_device_request_updated_at, core_device_request.updated_by AS core_device_request_updated_by, core_device_request.is_deleted AS core_device_request_is_deleted FROM core_device_request WHERE core_device_request.request_id = %(pk_1)s] [parameters: {'pk_1': '99da21c6-e76f-4595-b0a6-32061934938d'}] (Background on this error at: https://sqlalche.me/e/20/e3q8)
该报错在云端所有接口调用中都有出现,出现频率不定,有时频发有时偶发,并且具有两个特点
-
发生超时错误后不进行任何操作,一段时间后会服务自动恢复正常
-
发生超时错误后重启数据库或licloud-api服务,服务立即恢复正常
-
发生超时错误时licloud-api所在主机与MySQL数据库主机之间网络连接正常
-
发生超时错误时可以正常使用Navicat、DataGrip等GUI工具连接至MySQL数据库
2、排查过程
频繁发生超时问题后技术部采取了如下措施进行问题排查
2.1 协调移动云技术支持排查网络日志
最初发生该问题时,怀疑是移动云服务器网络连接问题,联系移动云技术支持人员进行问题排查,跟踪观察了licloud-api服务器与mysql服务器之间的网络流量,未发现有明显问题,根据移动云技术人员的建议,修改了如下配置:
2.1.1 排查网络带宽问题
-
数据传输速度:如果数据库服务器和客户端之间的网络带宽有限,大数据的传输速度可能会变慢。这可能导致客户端在尝试读取或写入大量数据时超过了
net_read_timeout
或net_write_timeout
的设置,从而导致连接超时。 -
响应时间:网络带宽限制可能导致数据包的延迟增加,尤其是在数据量大或者连接数多的情况下。这可能使得客户端请求的响应时间变长,进而可能触发超时设置
解决方案: 增加网络带宽从原有的50MB,增加到100M
超时问题没有改善
2.1.2 修改无状态安全组
由于底层设备有个会话3600s老化的机制,两端没有交互的话会话是会断开的,所以需要配置keepalived或者改成无状态安全组.
配置内核里的这个参数net.ipv4.tcp_keepalive_time,内核会发送保活探测包检查连接是否仍然有效
net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
超时问题没有改善
2.1.3 交互与非交互超时时间过长导致
mysql数据库服务器上部署的数据库访问异常问题,经过前期的排查服务器网络、服务器操作系统的TCP连接保活参数、数据库服务端的会话超时时间参数;
1、排查服务器网络正常,排除这个主机网络原因
2、根据我们的经验,可能是访问链路上不同节点的超时时间不一致导致MySQL会话超时,前期记录的数据是安全组存在3600s的超时时间、服务器系统默认是7200s的会话超时时间,数据库服务端配置的是30天的会话超时时间,会出现TCP连接长时间没有交互的情况下,安全组已经中断连接的情况下,服务器和数据库服务端的连接依旧保活;7月29日调整了服务器操作系统TCP会话保活探测时间、8月2日调整了数据库服务端的会话超时时间为1200s,
[mysqld] wait_timeout = 1200 interactive_timeout = 1200 #这里是8小时 我们改成了3小时
2.2 网络配置、服务配置排查优化
查阅网络资料以及参考移动云技术人员的建议,考虑了如下一些可能原因并进行了针对性优化
2.2.1 查询中大量数据被发送,由于数据传输时间不够导致
增加net_read_timeout的值。
修改 MySQL 的配置文件(通常是 my.cnf
或 my.ini
文件)。
在配置文件中,找到 [mysqld]
部分,并添加或修改以下行:
iniCopy Code [mysqld]net_read_timeout = 60 #这里是60 我们修改成了600
保存文件后,重新启动 MySQL 服务
超时问题没有改善
2.2.2 交互与非交互超时时间过短导致
-
wait_timeout:
-
作用:控制非交互式连接的超时时间。这类连接通常是由应用程序或脚本通过连接池管理的,比如 Web 应用与数据库之间的连接。
-
影响:如果一个连接在设定的
wait_timeout
秒内没有任何活动(例如查询、更新等),MySQL 会自动关闭这个连接。这可以避免长时间空闲的连接占用数据库资源。
-
-
interactive_timeout:
-
作用:控制交互式连接的超时时间。这类连接通常是用户直接通过命令行或 GUI 工具与数据库交互的连接。
-
影响:与
wait_timeout
类似,但interactive_timeout
更适用于用户交互时的连接。如果一个用户连接在设定的interactive_timeout
秒内没有任何活动,MySQL 会自动关闭这个连接。
-
在 MySQL 的配置文件(如 my.cnf
或 my.ini
)中,设置 wait_timeout,interactive_timeout:
[mysqld] wait_timeout = 31536000 interactive_timeout = 31536000
# 这里是八小时 我们改成了30天
超时问题没有改善
2.2.3 初次连接时,连接时间设定太少
增加connect_timeout的值改善。
永久改变 connect_timeout
的值,使其在 MySQL 重启后仍然生效,需要修改 MySQL 的配置文件(通常是 my.cnf
或 my.ini
文件)。
在配置文件中,找到 [mysqld]
部分,并添加或修改以下行:
iniCopy Code [mysqld]connect_timeout = 20 # 这里是20 我们设置成120
保存文件后,重新启动 MySQL 服务
超时问题没有改善
2.2.4 BLOB值太大的问题
调整配置文件max_allowed_packet。
就更新大量的数据来说,可以进行两个方面的设置:将系统变量net_read_timeout设置得大一点,再将配置文件中的max_allowed_packet设置大一点。
max_allowed_packet
是 MySQL 服务器允许的最大数据包大小。默认情况下,这个值为 4MB。如果你的更新操作涉及到更大的数据量,例如大型 BLOB 数据的插入或更新,可能需要增加这个参数的设置。
在 MySQL 的配置文件(如 my.cnf
或 my.ini
)中,设置 max_allowed_packet
:
[mysqld] max_allowed_packet = 4M # 这里是4M ,设置 max_allowed_packet 为 100MB
超时问题没有改善
2.2.5 索引、连接池问题
根据移动云技术人员建议,考虑数据库创建时的索引和连接池配置
在flask项目中添加了如下代码;
SQLALCHEMY_ENGINE_OPTIONS = { "poolclass": QueuePool, "pool_size": 10, "max_overflow": 20, "pool_timeout": 30, "connect_args": {"connect_timeout": 10}, "pool_recycle": 8, }
后续没有发现过超时问题
2.3 腾讯云/阿里云服务器测试
为确定是移动云服务器还是代码导致报错,将相同代码分别部署在腾讯云、阿里云服务器上进行长时间测试,从2024年8月9日下午2-3时至2024年8月13日下午2-3时,期间每隔三分钟向云服务器服务发送一次模拟容量检测请求
从结果来看,腾讯云、阿里云服务器均未出现数据库连接超时及其他错误
2.4 本地开发服务器测试
为保障产品部正常进行新版上位机、边端的联调测试,将相同代码部署在本地开发服务器上
2024年8月8日至2024年8月13日的联调测试中未出现过数据库超时问题
3、问题分析及解决方案
根据排查及复现过程进行推论分析,可以确定造成数据库连接超时的原因是:Flask项目中没有正确配置Flask-sqlalchemy连接池参数,尤其是连接池中的连接回收时间,使得MySQL与Flask-sqlalchemy之间的连接被提前意外关闭
具体来说:
-
云端工作过程中,flask项目通过sqlalchemy和pymysql模块与mysql数据库建立连接,该连接以连接池的形式被sqlalchemy模块创建、维护
-
sqlalchemy默认不会对连接池中的连接进行回收,即不会主动关闭长时间未进行任何操作、通讯的空闲连接
-
mysql默认会关闭28800秒(8小时)内未进行任何操作、通讯的空闲连接
综合上述三点,当sqlalchemy连接池中某个连接在8小时内都没有任何操作时,mysql会主动关闭该连接,但是sqlalchemy并不知道该连接已经被关闭,在下一次需要连接数据库时仍然会调用一个实际数据库上已经被关闭的连接,就会出现连接mysql数据库超时的报错。
根据上述分析,在移动云和腾讯云主机上修改sqlalchemy的pool_recycle参数为-1(默认不回收连接,等价于超时时间为无限长)、mysql的wait_timeout为10秒,进行长时间测试,成功复现了数据库超时问题。
上述问题的解决方案是合理设置sqlalchemy连接池回收时间、mysql数据库的等待超时时间,目前将sqlalchemy的pool_recycle设置为1200秒,mysql数据库的wait_timeout设置为1800秒,在测试中未再发现超时报错。
相关文章:

MySQL数据库连接超时问题排查报告
1、问题描述 边端设备访问云端过程中有概率出现MySQL数据库连接超时报错,具体报错代码如下: [2024-08-13 13:47:44,036] ERROR in app: Exception on /est-tasks/start [POST] Traceback (most recent call last): File "/usr/local/lib/python3.1…...

代码随想录第三天 | 链表
文章目录 链表理论知识定义链表删除链表 Leetcode203 移除链表元素代码实现 Leetcode707 设计链表代码实现复杂度分析错误点 Leetcode206 反转链表新建链表双指针法 链表理论知识 链接: https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.h…...

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

putty中修改默认窗口大小和字体、字号
在WinSCP中调用putty,发现默认窗口太小,字号也很小,非常不友好。现在显示器都是1080p起步,所以很有必要修改之。 以中文版v0.70为例,方法: 1. 点击左上角图标 ,选择下拉菜单中的“修改设置”&…...

Windows下网络编与ESP8266-WiFi通信(win32-API)
一、前言 络编程是指编写程序使不同计算机之间能够通过网络进行通信和数据交换。网络编程涉及使用网络协议和编程接口来建立、管理和终止网络上的数据通信。在这一领域中,TCP/IP协议族是核心组成部分,尤其TCP(传输控制协议)是面向…...

【Golang】golang安装一些依赖包时总是失败
Golang安装一些依赖包失败: 比如安装gin包:go get -u github.com/gin-gonic/gin 可能会报错:连接网络失败、超时等 这时可能需要修改go的环境配置,修改代理即可: go env -w GO111MO…...

ubuntu如何监控Xvfb虚拟显示器
在Ubuntu中监控Xvfb显示器主要涉及到使用VNC服务器来远程访问这个环境。以下是一些基本步骤: 安装Xvfb和相关工具: 使用apt安装Xvfb和x11vnc,x11vnc是一个VNC服务器,可以远程访问Xvfb创建的虚拟桌面环境。 sudo apt-get install xvfb sudo ap…...

小型需求管理软件盘点:8款功能强大的工具
本文介绍了以下8款工具:PingCode、Worktile、易得云、Ping、燃草、Gitee、Monday.com、Slack。 在现代企业管理中,需求管理一直是个让人头疼的问题,特别是对于小型企业来说,选择一款合适的需求管理软件往往比想象中更复杂。如果选…...

Labelme的安装与使用教程
文章目录 一、Labelme是什么?二、安装步骤1.新建虚拟环境2.安装Labelme3.Labelme的使用 三、json2yolo 一、Labelme是什么? Labelme是一个用于图像标注的开源工具,可以实现图像标注、语义分割、实例分割等。 本文记录一下labelme的安装与使…...

C#基础:数据库中使用Linq作分组处理(反射/直接分组)
目录 一、使用反射分组 二、不使用反射分组 三、调用示例 四、代码demo 一、使用反射分组 private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty) {// 获取分组字段的类型var propertyInfo typeof(T).…...

Revite二次开发_使用WPF和WebView2制作一个访问网站的窗口
如果想在revit里打开网页,可以使用WebView2来实现,下面是一个代码示例。 也尝试过使用CefSharp,但由于Revit本身也使用了CefSharp,所以需要根据不同的Revit版本选择适合的CefSharp版本,比较麻烦,所以最好还…...

Java Spring Boot 连接数据库
要在Java Spring Boot应用程序中连接数据库,您需要遵循以下步骤: 1. 添加数据库依赖项:在您的Spring Boot项目中的pom.xml文件中添加数据库依赖项,例如MySQL或PostgreSQL等。例如,如果您要连接MySQL数据库,…...

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景
消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式(Push)和拉模式(Pull)各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景: 推模式(Push) 特点:…...

springboot jar是如何启动的
我们先来看一个项目的打完包后的MANIFEST.MF文件: Manifest‐Version: 1.0 Implementation‐Title: spring‐learn Implementation‐Version: 0.0.1‐SNAPSHOT Start‐Class: com.tulingxueyuan.Application Spring‐Boot‐Classes: BOOT‐INF/classes/ Spring‐Bo…...

Android 12系统源码_屏幕设备(二)DisplayAdapter和DisplayDevice的创建
前言 在Android 12系统源码_屏幕设备(一)DisplayManagerService的启动这篇文章中我们具体分析了DisplayManagerService 的启动流程,本篇文章我们将在这个的基础上具体来分析下设备屏幕适配器的创建过程。 一、注册屏幕适配器 系统是在Disp…...

常用Mysql命令
前言 本文列举了一些常见的mysql操作 正文 一、连接和登录 MySQL 1. 使用命令行登录 MySQL 注意:需要将mysql的bin目录导入到环境变量中 mysql -u 用户名 -p示例: mysql -u root -p执行上述命令后,系统会提示输入密码,输入…...

IDEA Debug工具
一、Debug工具栏 自定义debug工具栏:先把debug程序运行起来->右击->配置 常用的工具: 二、DeBug常用图标详解 三、DeBug实践操作 常规Debug:略。 Stream Chain:处理流式语句 Reset Frame:重置方法入栈 …...

ARM64的汇编资源
最近在写一本ARM64的教材,所以在晚上查找了一下相关资源,都是免费开源的,不包括盗版书籍。 Exploring AArch64 assembler Roger Ferrer Ibez的博客文章,写在2016-2017年,内容简单充实,适合入门。 《ARM6…...

实验室安全分级分类管理系统在高校中的具体应用
盛元广通高校实验室安全分级分类管理系统的构建,旨在通过科学合理的管理手段,提高实验室的安全水平,保障师生的人身安全,防止实验事故的发生。这一系统通常包括实验室安全等级评估、分类管理、风险控制、安全教育与培训、应急响应…...

使用 prerenderRoutes 进行预渲染路由
title: 使用 prerenderRoutes 进行预渲染路由 date: 2024/8/20 updated: 2024/8/20 author: cmdragon excerpt: prerenderRoutes 函数是 Nuxt 3 中一个强大的工具,它能够帮助开发者优化页面加载速度和改善用户体验。通过使用 prerenderRoutes,你能够灵活地指定需要预渲染的…...

【深度解析】WRF-LES与PALM微尺度气象大涡模拟
查看原文>>>【深度解析】WRF-LES与PALM微尺度气象大涡模拟 针对微尺度气象的复杂性,大涡模拟(LES)提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟,这些过程往往与天气模式、地形影响和…...

redis事件机制
redis服务器是一个由事件驱动(死循环)的程序,它总共就干两件事: 文件事件:利用I/O复用机制,监听Socket等文件描述符发生的事件,如网络请求时间事件:定时触发的事件,负责完成redis内部定时任务&…...

【C++】模拟实现vector
可以把vector看作升级版的数组,可采用下标进行访问,非常高效,大小可动态改变,会自动扩容,数据存储在堆空间上。 VECROR 成员变量、函数及模板总览构造函数和析构函数无参构造函数构造n个元素大小的空间并初始化通过某个…...

【CAN-IDPS】汽车网关信息安全要求以及实验方法
《汽车网关信息安全技术要求及试验方法》是中国的一项国家标准,编号为GB/T 40857-2021,于2021年10月11日发布,并从2022年5月1日起开始实施 。这项标准由全国汽车标准化技术委员会(TC114)归口,智能网联汽车分会(TC114SC34)执行,主管部门为工业和信息化部。 该标准主要…...

EASE-Grid是啥东西?
EASE-Grid(Equal-Area Scalable Earth Grid,等面积可扩展地球网格)是NASA设计的网格系统,主要用于存储和处理全球范围内的地球科学数据。可以被理解为一种特殊的投影方式,使得在全球范围内进行数据分析和可视化时&…...

前端用户管理模块方法及api分析
用户管理 方法及对应api 搜索 searchSysUser / GetSysUserListByPage 重置 resetData 添加用户 addShow :点击按钮后出现对话框,含有提交 submit / SaveSysUser、取消按钮 修改 editSysUser / UpdateSysUser 删除 deleteById / DeleteSysUser 分配角色…...

microsoft edge怎么关闭安全搜索
microsoft edge浏览器为用户提供了安全搜索功能,旨在帮助用户过滤掉搜索结果中出现的不当信息。然而,有些用户可能觉得安全搜索功能限制了他们的浏览体验或工作需求。下面就给大家带来关闭microsoft edge安全搜索的相关内容,一起来看看吧。&a…...

Qt | QSQLite内存数据库增删改查
点击上方"蓝字"关注我们 01、演示 参数随便设置 查询 修改 右键菜单是重点 手动提交,点击Submit All...

【论文阅读】SegNeXt:重新思考卷积注意力设计
《SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation》 原文:https://github.com/Visual-Attention-Network/SegNeXt/blob/main/resources/paper.pdf 源码:https://github.com/Visual-Attention-Network/SegNeXt 1、简介 …...

【C++】String类:标准库介绍
目录 一.预备知识 1.auto关键字 2.范围for 3.迭代器 二.标准库里的string 1.string类的基本介绍 2.构造函数 编辑 3.访问及遍历操作 3.1 operator [] 3.2 基于范围for 3.3 使用迭代器 4.迭代器 5.容量操作 5.1 size和length 5.2 capacity 5.3 reserve和resiz…...