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

mysql连接池

        本文主要探讨mysql连接池的实现。

readme

*****************************************************mysql连接池
*****************************************************概述:高并发情况下,大量TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源和TCP四次挥手耗费显著,本项目主要用连接池的方式提高mysql的访问瓶颈.主要文件:run.sh                  项目运行脚本clean.sh                编译清理脚本CMakeLists.txt          编译文件log.h                   调试信息打印接口connection.h            mysql操作库connection.cpp          mysql操作库实现connection_pool.h       mysql连接池库connection_pool.cpp     mysql连接池库实现mysql.cnf               mysql配置文件main.cpp                mysql连接池测试文件编译运行:main.cpp中有连接池测试范例,也可自行修改范例sh run.sh 运行该指令可编译运行项目输出测试范例结果

项目文件结构

安转mysql-8.0

apt install -y mysql-server-8.0 libmysqlclient-devsystemctl start mysqlsystemctl enable mysqlsystemctl status mysqlmysql_secure_installationmysql -u root -palter user "root"@"localhost" IDENTIFIED BY '123456';mysql -u root -p=123456############## mysql.h位于/usr/include/mysql############## 也可通过mysql源码编译安装 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.41.tar.gz

项目运行结果

run.sh

#!/bin/bashif [ -f ./Makefile ]
thenmake clean
ficmake .makeecho "---------------------------------"./pro

 clean.sh

#!/bin/bashrm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake *.o pro

 CMakeLists.txt

###################################
#                                 
#       mysql连接池编译连接文件     
#                                 
#
####################################最低版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.20) #设置g++编译器
SET(CMAKE_CXX_COMPILER "g++-11")                    #添加编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")#设置工程名
PROJECT(CLASS)                                              #打印消息
MESSAGE(STATUS "mysql connection pool")                           #查找动态库
find_library(MYSQL_LIBRARY mysqlclient NAMES mysqlclient PATHS "/usr/lib/x86_64-linux-gnu/" ) #生成可执行文件
ADD_EXECUTABLE(pro main.cpp connection.cpp connection_pool.cpp)                      #链库
target_link_libraries(pro ${MYSQL_LIBRARY})

log.h

/**      日志调试打印*      格式:时间 文件:函数:行号:str*/#ifndef __LOG__
#define __LOG__#define LOG_PRINT(str) \std::cout << __TIMESTAMP__ << " " <<  __FILE__ << ":" << __FUNCTION__ << ":" \<< __LINE__ << ":"  << str << std::endl;  
#endif

connection.h

/**      mysql相关操作:*              初始化连接数据库*              释放数据库连接*              连接数据库*              数据增删改*              数据查询*              数据库连接时长反馈*              数据库连接时长刷新*/#include <mysql/mysql.h>
#include <ctime>
#include <string>
#include <iostream>class Connection
{public://初始化数据库连接Connection();//释放数据库连接~Connection();//连接数据库bool connect_mysql(std::string ip, unsigned int port, std::string user, \std::string password, std::string dbname);//数据增删改bool idu_mysql(std::string sql);//数据查询bool query_mysql(std::string sql);//数据库连接时长刷新void refresh_alive_time(){alive_time = clock();}//数据库连接时长反馈std::clock_t get_alive_time(){return clock() - alive_time;}private:MYSQL *conn;            //数据库连接句柄std::clock_t alive_time;//数据库连接存活时间 //
};      //end of class  Connection

connection.cpp 

/**      mysql相关操作:*              初始化连接数据库*              释放数据库连接*              连接数据库*              数据增删改*              数据查询*/#include "connection.h"
#include "log.h"//初始化数据连接
Connection::Connection()
{conn = mysql_init(nullptr);if(conn == nullptr)LOG_PRINT("mysql init error");
}//释放数据库连接
Connection::~Connection()
{if(conn != nullptr)mysql_close(conn);
}//数据库连接
bool Connection::connect_mysql(std::string ip, unsigned int port, std::string user, \std::string password, std::string dbname)
{MYSQL *con = mysql_real_connect(conn,ip.c_str(), user.c_str(),password.c_str(), dbname.c_str(), port, nullptr, 0);return con != nullptr;
}//数据库增删改
bool Connection::idu_mysql(std::string sql)
{if((mysql_query(conn, sql.c_str()))){LOG_PRINT("idu error:" + sql);return false;}return true;
}//数据库查询
bool Connection::query_mysql(std::string sql)
{if(mysql_query(conn, sql.c_str())){LOG_PRINT("select error:" + sql);return false;}MYSQL_RES *ret = mysql_store_result(conn);if(ret == nullptr){LOG_PRINT("select error:" + sql);return false;}MYSQL_ROW row;MYSQL_FIELD* filed;while((filed = mysql_fetch_field(ret)))std::cout << filed->name << "\t";std::cout << std::endl;while((row = mysql_fetch_row(ret))){for(int i = 0; i < mysql_num_fields(ret); i++){std::cout << row[i] << "\t";}std::cout << std::endl;}mysql_free_result(ret);return true;
}

connection_pool.h

/**      mysql连接池相关:*              获取连接池实例*              获取空闲连接*              读取mysql配置*              生产连接*              回收超时链接*/#include <memory>
#include <queue>
#include <mutex>
#include <atomic>
#include <condition_variable>
#include <thread>
#include <list>#include "connection.h"
#include "log.h"class Connection_Pool
{public://获取连接池实例static Connection_Pool *get_pool();//获取空闲链接std::shared_ptr<Connection> get_connection();private://懒汉单例(构造私有化)Connection_Pool();//读取mysql配置bool load_mysql_cnf();//生产新链接void manufacture_connection();//回收超时链接void recycle_timeout_connection();std::string ip;unsigned int port;std::string user;std::string password;std::string dbname;unsigned int init_conn_size;                    //连接池初始链接量unsigned int max_conn_size;                     //连接池最大连接量unsigned int wait_conn_alive_max_timeout;       //未使用连接存活最大时时间unsigned int get_max_timeout;                   //获取连接池链接等待的最大时间std::queue<Connection*> conn_queue;             //mysql链接队列std::mutex queue_mutex;                         //队列安全互斥锁std::atomic_uint conn_cnt;                      //连接池的连接量std::condition_variable cv;                     //线程间通信
};

connection_pool.cpp

/**      mysql连接池相关:*              获取连接池实例*              获取空闲连接*              读取mysql配置*              生产连接*              回收超时链接*/
#include <fstream>
#include <sstream>
#include <map>
#include <functional>#include "connection_pool.h"Connection_Pool* Connection_Pool::get_pool()
{static Connection_Pool conn_pool;return &conn_pool;
}//获取空闲连接
std::shared_ptr<Connection> Connection_Pool::get_connection()
{std::unique_lock<std::mutex> lock(queue_mutex);while(conn_queue.empty()){if(std::cv_status::timeout == cv.wait_for(lock,std::chrono::milliseconds(get_max_timeout))){if(conn_queue.empty()){LOG_PRINT("get connection timeout...");return nullptr;}}}//自定链接义删除器,使用完归还到队列,未定义则会调用析构关闭连接std::shared_ptr<Connection> con(conn_queue.front(),[&](Connection *c){std::unique_lock<std::mutex> lock(queue_mutex);c->refresh_alive_time();conn_queue.push(c);});conn_queue.pop();cv.notify_all();return con;
}bool Connection_Pool::load_mysql_cnf()
{std::map<std::string,std::string> config;std::string line;std::ifstream file("mysql.cnf");if(!file.is_open()){LOG_PRINT("open mysql.cnf error");return false;}while(getline(file,line)){std::istringstream is_line(line);std::string key;if(getline(is_line,key,'=')){std::string value;if(getline(is_line,value))config[key] = value;}}ip = config["ip"];port = atoi(config["port"].c_str());user = config["user"];password = config["password"];dbname = config["dbname"];init_conn_size = atoi(config["init_conn_size"].c_str());max_conn_size = atoi(config["max_conn_size"].c_str());wait_conn_alive_max_timeout = atoi(config["wait_conn_alive_max_timeout"].c_str());get_max_timeout = atoi(config["conn_pool_timeout"].c_str());return true;
}Connection_Pool::Connection_Pool()
{//加载mysql配置if(!load_mysql_cnf()){LOG_PRINT("load mysql config fail");}//创建初始链接for(int i = 0; i < init_conn_size; i++){Connection *con = new Connection();con->connect_mysql(ip, port, user, password, dbname);   //链接mysqlcon->refresh_alive_time();                              //刷新链接时间conn_cnt++;                                             //链接池链接量++}//生产连接线程std::thread manu_conn(std::bind(&Connection_Pool::manufacture_connection,this));manu_conn.detach();//回收超时链接线程std::thread recycle_conn(std::thread(std::bind(&Connection_Pool::recycle_timeout_connection,this)));recycle_conn.detach();
}void Connection_Pool::manufacture_connection()
{for(;;){std::unique_lock<std::mutex> lock(queue_mutex);while(!conn_queue.empty()){cv.wait(lock);  //未使用链接线程不为空则等待使用}//建立链接数小于最大链接数构建新链接if(conn_cnt < max_conn_size){Connection *con = new Connection();con->connect_mysql(ip, port, user, password, dbname);   //链接mysqlcon->refresh_alive_time();                                //刷新链接时间conn_cnt++;                                             //链接池链接量++conn_queue.push(con);}cv.notify_all();}
}void Connection_Pool::recycle_timeout_connection()
{for(;;){std::this_thread::sleep_for(std::chrono::seconds(wait_conn_alive_max_timeout));std::unique_lock<std::mutex> lock(queue_mutex);while(conn_cnt > init_conn_size){//对头元素为存活时间最大的链接,若队头链接时间小于最大存活时间则整个队列时间均小于Connection *con = conn_queue.front();if(con->get_alive_time() >= (wait_conn_alive_max_timeout *1000)){conn_queue.pop();conn_cnt--;delete con;     //调用析构关闭连接}else{break;}}}
}

mysql.cnf

ip=localhost
port=3306
user=root
password=123456
dbname=test
init_conn_size=10
max_conn_size=1024
#秒
wait_conn_alive_max_timeout=60
#毫秒
get_max_timeout=100

main.cpp

#include <cstring>
#include <ctime>
#include "connection_pool.h"int main()
{clock_t begin = clock();char sql1[1024] = { 0 };char sql2[1024] = { 0 };char sql3[1024] = { 0 };char sql4[1024] = { 0 };Connection_Pool *cp = Connection_Pool::get_pool();std::thread t1([&sql1,&cp]() {for (int i = 0; i < 2500; ++i){std::shared_ptr<Connection> sp ;while(1){sp = cp->get_connection();if(sp != nullptr)break;}memset(sql1,0,1024);sprintf(sql1,"insert into user(id,name,saving_comming) values(%d,'cxb1',1000)",i);sp->idu_mysql(sql1);}});std::thread t2([&sql2,&cp]() {for (int i = 0; i < 2500; ++i){std::shared_ptr<Connection> sp ;while(1){sp = cp->get_connection();if(sp != nullptr)break;}memset(sql2,0,1024);sprintf(sql2,"insert into user(id,name,saving_comming) values(%d,'cxb2',1000)",i);sp->idu_mysql(sql2);}});std::thread t3([&sql3,&cp]() {std::shared_ptr<Connection> sp ;while(1){sp = cp->get_connection();if(sp != nullptr)break;}for (int i = 0; i < 2500; ++i){memset(sql3,0,1024);sprintf(sql3,"insert into user(id,name,saving_comming) values(%d,'cxb3',1000)",i);sp->idu_mysql(sql3);}});std::thread t4([&sql4,&cp](){std::shared_ptr<Connection> sp ;while(1){sp = cp->get_connection();if(sp != nullptr)break;}for (int i = 0; i < 2500; ++i){memset(sql4,0,1024);sprintf(sql4,"insert into user(id,name,saving_comming) values(%d,'cxb4',1000)",i);sp->idu_mysql(sql4);}});t1.join();t2.join();t3.join();t4.join();clock_t end = clock();std::cout << "time:" <<  (static_cast<double>(end - begin) / CLOCKS_PER_SEC) << "s" << std::endl;return 0;
}

相关文章:

mysql连接池

本文主要探讨mysql连接池的实现。 readme *****************************************************mysql连接池 *****************************************************概述&#xff1a;高并发情况下&#xff0c;大量TCP三次握手、MySQL Server连接认证、MySQL Server关闭连…...

领码科技:在低代码技术浪潮中的分享与探索

前言&#xff1a; 25年的职业生涯&#xff0c;赋予了我深厚的技术积累与实践经验。从武汉大学的工测系毕业&#xff0c;到央企副总工的职位&#xff0c;我始终站在IT浪潮的最前沿。然而&#xff0c;离开企业后&#xff0c;我并未停止前行的脚步。从2024年11月起&#xff0c;我选…...

闻所闻尽:穿透声音的寂静,照见生命的本真

在《楞严经》的梵音缭绕中&#xff0c;"闻所闻尽"四个字如晨钟暮鼓&#xff0c;叩击着每个修行者的心门。这个源自观世音菩萨耳根圆通法门的核心概念&#xff0c;既是佛门修行的次第指引&#xff0c;更蕴含着东方哲学对生命本质的终极叩问。当我们穿越时空的帷幕&…...

蓝桥与力扣刷题(蓝桥 三角形面积)

题目&#xff1a; 如上图所示。图中的所有小方格面积都是 1。 那么&#xff0c;图中的三角形面积应该是多少呢&#xff1f; 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&…...

Linux信号:一场内核与用户空间的暗战

在Linux系统的黑暗森林中&#xff0c;每个进程都是小心翼翼的猎人。当一束神秘的信号光划过天际&#xff0c;内核瞬间变身信号调度大师&#xff0c;在进程的生死簿上书写着命运。这场跨越用户空间与内核态的博弈&#xff0c;远比表面看到的更加惊心动魄。 一、 信号诞生的量子…...

Spring Boot 异步返回对象深度解析

前言 在现代高并发、高响应的应用场景中&#xff0c;Spring Boot 的异步处理能力是提升系统吞吐量和用户体验的关键技术之一。无论是实时数据推送、大文件传输&#xff0c;还是复杂异步任务调度&#xff0c;Spring Boot 提供了多种灵活的异步处理机制以满足不同需求。本文将从…...

Android Compose 基础布局之 Box 和 Stack 源码深度剖析(九)

Android Compose 基础布局之 Box 和 Stack 源码深度剖析 一、引言 1.1 Android 开发中布局的重要性 在 Android 应用开发里&#xff0c;布局是构建用户界面&#xff08;UI&#xff09;的关键环节。良好的布局设计能够提升用户体验&#xff0c;使应用界面更加美观、易用且具有…...

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

UE5材质法线强度控制节点FlattenNormal

连法 FlattenNormal内部是这样的 FlattenNormal的作用是用来调整法线强度 连上FlattenNormal后 拉高数值...

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …...

python爬虫解析器bs4,xpath,pquery

0x00 bs4 解析器的作用就是可以直接解析html页面&#xff0c;可以直接从网页中提取标签中的内容&#xff0c;而不用在使用正则表达式进行提起数据 import requests from bs4 import BeautifulSoup html_content <li id123><a hrefdfsdf>123</a>789</l…...

分析K8S中Node状态为`NotReady`问题

在Kubernetes&#xff08;k8s&#xff09;集群中&#xff0c;Node状态为NotReady通常意味着节点上存在某些问题&#xff0c;下面为你分析正常情况下节点应运行的容器以及解决NotReady状态的方法。 正常情况下Node节点应运行的容器 1. kubelet kubelet是节点上的核心组件&…...

【最后203篇系列】021 Q201再计划

忙了一周&#xff0c;终于到周末有时间再细细想这个问题了。这周还是不经意的弥补了kv硬盘存储库这个小空白的&#xff0c;这样也有助于构建更好的Q201。 计划是到6.1再发版&#xff0c;之所以留那么长时间&#xff0c;一方面是因为平时的确忙&#xff0c;另一方面则是可以有更…...

CA 机构如何防止中间人攻击

在现代互联网中&#xff0c;中间人攻击&#xff08;Man-in-the-Middle Attack&#xff0c;简称 MITM&#xff09;是一种常见的网络攻击方式&#xff0c;攻击者通过拦截和篡改通信双方的信息&#xff0c;进而窃取敏感数据或执行恶意操作。为了防止中间人攻击&#xff0c;证书颁发…...

CUL-CHMLFRP启动器 windows图形化客户端

CUL-CHMLFRP启动器 windows图形化客户端 基于v2 api开发的chmlfrp ui版本的第三方客户端 CUL原名CHMLFRP_UI CUL顾名思义为CHMLFRP-UI-Launcher 下载地址&#xff1a;https://cul.lanzoul.com/b00pzv3oyj 密码:ff50 下载解压运行即可&#xff08;仅支持win7以上版本&#xf…...

C语言基础08

内容提要 数组 排序算法&#xff1a;冒泡排序 二维数组 字符数组 数组 冒泡排序 排序思想&#xff08;向前冒泡&#xff09; 一次只排好一个数&#xff0c;针对n个数&#xff0c;最差情况需要n-1次就可以排好 每次排序假定第一个元素是最大或者最小&#xff0c;用第一个…...

基于javaweb的SpringBoot儿童爱心管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…...

JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源&#xff1a;在这位大佬的基础上添加了一些东西&#xff0c;欢迎大家支持原创&#xff0c;大佬太棒了&#xff1a;JavaScript |&#xff08;五&#xff09;DOM简介 | 尚硅谷JavaScript基础…...

模型整合-cherry studio+mysql_mcp_server服务配置

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是模型上下文协议&#xff0c;它允许大型语言模型&#xff08;LLM&#xff09;通过协议与外部工具或服务交互&#xff0c;动态获取实时数据或执行操作。简单来说&#xff0c;它让模型不再局限于静态知识库&…...

【QA】装饰模式在Qt中有哪些运用?

在Qt框架中&#xff0c;装饰模式&#xff08;Decorator Pattern&#xff09;主要通过继承或组合的方式实现&#xff0c;常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例&#xff1a; 一、QIODevice装饰体系&#xff08;继承方式&#xff09; 场景 …...

window 设置自动开启/关闭程序(分享)

打开计算机管理 winr 输入 compmgmt.msc 找到任务计划程序创建任务 设置开启任务 常规&#xff1a;添加名称与描述 触发器&#xff1a;新建触发时间与次数 操作&#xff1a;新建执行程序 添加任务对应的位置 以便修改 设置关闭任务 添加批处理文件&#xff0c;写完后吧 .…...

QT布局笔记

在 Qt 中&#xff0c;如果你希望将一个 QGroupBox 放置在水平布局&#xff08;QHBoxLayout&#xff09;的上方&#xff0c;可以通过将它们添加到一个垂直布局&#xff08;QVBoxLayout&#xff09;中来实现。垂直布局会将子布局或子控件按垂直顺序排列&#xff0c;因此 QGroupBo…...

【LLM大模型】LangChain学习

大模型对话 from langchain.chat_models import ChatOpenAI # 内置对话模型 from langchain.schema import HumanMessage, SystemMessage, AIMessage # 用户提示词&#xff0c;系统提示词&#xff0c; AI响应chat ChatOpenAI(temperature0.7, openai_api_keyxxxxxxxxxxxx) #…...

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介 1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介 2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09; 3.1 介绍&#xf…...

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…...

mysql 查询进程查看并释放

在MySQL中&#xff0c;查看和管理进程&#xff08;例如查询、连接等&#xff09;是数据库维护和性能调优的重要部分。以下是一些常用的方法来查看MySQL进程并释放它们。 1. 查看进程 你可以使用SHOW PROCESSLIST命令来查看当前MySQL服务器上的所有进程。这个命令会显示正在执…...

C++代码2-多目标算法求解车辆路径规划

为了解决车辆路径规划问题,我们需要在同一模型中同时考虑多个目标,其中一个目标是降低运营总成本,而另一个目标是降低总的碳排放量。使用组合算法,包括人工蜂群算法(Artificial Bee Colony, ABC)、模拟退火算法(Simulated Annealing, SA)、以及多目标优化算法MODAD(Mu…...

JAVA学习*接口

接口 在生活中我们常听说USB接口&#xff0c;那接口是什么呢&#xff1f; 在Java中&#xff0c;接口相当于多个类的一种公共规范&#xff0c;是一种引用数据类型。 定义接口 public interface IUSB {public static final String SIZE "small";public abstract vo…...

Matplotlib

一、Matplotlib快速入门 学习目标 了解什么是matplotlib 为什么要学习matplotlib matplotlib简单图形的绘制 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工…...

新版frp-0.61.0 实现泛解析域名穿透 以及 https启用

需要在公网服务器的域名解析平台 泛域名 *.aa.com 解析到frp 公网服务器的ip x.x.x.x 对于frpc.toml 文件的 serverAddr 绑定的ip 需要公网服务器放行 bindPort 对于的端口 frpc.toml serverPort 对于的的是 frps.toml bindPort 端口 frps.toml bindPort 7000 vhostHTTPP…...

HTTPS 加密过程详解

HTTPS 详解及其加密过程流程框架 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于 HTTP 协议的安全通信协议&#xff0c;通过 SSL/TLS 协议对传输数据进行加密和身份验证&#xff0c;解决了 HTTP 明文传输的安全隐患。以下是其核心原理和加密流程的…...

lua垃圾回收

lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空&#xff0c;会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…...

springboot继承使用mybatis-plus举例相关配置,包括分页插件以及封装分页类

以下是使用 MyBatis-Plus 分页插件的完整配置和封装步骤&#xff0c;包括日志输出、驼峰转下划线、逻辑删除以及分页属性类的封装。 1. 引入依赖 确保在 pom.xml 中已经引入 MyBatis-Plus 的依赖&#xff1a; <XML> <dependency><groupId>com.baomidou<…...

智能汽车以太网系统测试:聚焦ETH链路高负载性能表现

引言 在智能汽车高速发展的今天&#xff0c;车载以太网作为车辆信息交互的“神经网络”&#xff0c;承担着传输海量数据的关键使命。它不仅能够满足车辆对高带宽、低延迟和高可靠性的通信需求&#xff0c;还为自动驾驶、智能座舱等复杂功能提供了强大的技术支持。然而&#xf…...

学习笔记:黑马程序员JavaWeb开发教程(2025.3.21)

10.7 案例-员工管理-分页查询-分析 形参的默认值可以使用注解来设置&#xff1a;RequestParam(default “1”) 10.8 案例-员工管理-分页查询-PageHelper插件 分页插件PageHelper帮助完成有关分页的所有操作&#xff0c;我们只要正常使用查询语句就可以了。插件会自动…...

计算机网络精讲day1——计算机网络的性能指标(上)

性能指标1&#xff1a;速率 概念1&#xff1a;比特 英文全称是binary digit&#xff0c;意思是一个二进制数字&#xff0c;因此一个比特就是二进制数字中的1或0&#xff0c;比特也是信息论中使用的信息量单位。 概念2&#xff1a;速率 网络中的速率指的是数据的传送速率&#…...

gin-路由handler封装思路

约束handler入参和返回为func(ctx, req) (resp, error)。通过反射&#xff0c;封装handler&#xff0c;在调用前后写入入参和返回的处理。 package testingimport ("context""fmt""reflect""strings""testing" )type ReqPa…...

【实战案例】用STAR+3W模型拆解电商支付系统设计文档

各位开发者朋友&#xff0c;上次分享了结构化写作的黄金公式后&#xff0c;很多同学反馈需要更具象的落地方法。今天通过真实电商支付系统案例&#xff0c;手把手教你用STAR3W模型写出可执行的设计文档&#xff01; 结构化写作的「黄金公式」 STAR原则 3W模型 Situation&…...

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比...

线性筛法求素数

时间复杂度 o&#xff08;n&#xff09; int cnt, primes[N];//cnt用来记录素数的下标 bool st[N];//用来标记合数 int minp[N];//最小质因数 void get_primes(int n) {for(int i 2;i < n;i )//从2开始找数 {if(!st[i])//如果这个数没有被筛出去过&#xff0c;说明是一…...

触动精灵对某东cookie读取并解密--记lua调用C语言

在Mac上构建Lua扩展模块&#xff1a;AES解密与Base64解码实战 今天我要分享一个实用技术&#xff1a;如何在Mac系统上为Lua编写和编译C扩展模块&#xff0c;特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…...

GEO:在AI时代抢占DeepSeekC位?

前言&#xff1a;当SEO遇见AGI——一场静默的流量革命 在生成式AI日均处理53亿次查询的今天&#xff0c;传统SEO的「关键词-排名-点击」逻辑正在崩塌。DeepSeek、ChatGPT、豆包等大模型用动态生成的答案&#xff0c;悄然截流了68%的搜索需求。更残酷的是&#xff1a;当用户问&q…...

【设计模式】策略模式

以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…...

第J6周:ResNeXt-50实战解析

文章目录 一、前期准备1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据3.再次检查数据4.配置数据集 四、模型复现1. 分组卷积模块2. 定义残差模块3. 堆叠残差单元4. 搭建ResNext-50网络5. 查看模型摘要 五、训练模型六、结果可视化总结&#xff1a; &…...

调试 ResNet18 cpp实现中的段错误(SIGSEGV)问题

调试 ResNet18 cpp实现中的段错误&#xff08;SIGSEGV&#xff09;问题 问题分析 您的程序在运行时遇到了段错误&#xff08;SIGSEGV&#xff09;&#xff0c;GDB显示错误发生在main()函数的第一行&#xff08;resnet18_allo_test.cpp:33&#xff09;。这种情况看起来很奇怪&…...

详细介绍IDI_APPLICATION和IDC_ARROW

书籍&#xff1a;《windows程序设计(第五版)》 环境&#xff1a;visual studio 2022 内容&#xff1a;HELLOWIN程序 说明&#xff1a;以下内容大部分来自腾讯元宝。 ​IDI_APPLICATION 与 IDC_ARROW 详解 ​1. IDC_ARROW&#xff08;光标资源标识符&#xff09;​ ​定义与…...

curl库+openssl库windows编译

一、工具准备 Visual Studio 2008&#xff1a;确保安装了 C 开发工具。 Git&#xff1a;用于克隆 cURL 的源码。 Perl&#xff1a;可以从 ActiveState Perl 下载并安装。 NASM&#xff08;可选&#xff09;&#xff1a;如果需要汇编优化&#xff0c;可以从NASM 官方网站 下载并…...

今日行情明日机会——20250321

后续投资机会分析 结合2025年3月21日盘面数据&#xff08;涨停56家&#xff0c;跌停31家&#xff09;&#xff0c;市场呈现结构性分化行情&#xff0c;海洋经济成为绝对主线&#xff0c;机器人概念局部活跃&#xff0c;人工智能表现较弱。以下是具体方向与策略建议&#xff1a…...

repo init 错误 Permission denied (publickey)

一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig &#xff08;此步骤是公司要求&#xff0c;设置gerrit地址为一个别名之类的&#xff0c;有的公司不需要&#xff09; 然后出现下面的错误&#xff0c;最后发现忘记设置git的用户名和邮箱 1. git config --globa…...