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

从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制

引言

在数据库开发中,PreparedStatement(预处理语句)是防止SQL注入、提升性能的重要工具。它通过分离SQL结构与参数值,不仅增强了安全性,还能利用预编译优化执行效率。本文将从Java JDBC驱动MySQL 8源码的双重视角,揭示PreparedStatement参数绑定与执行的底层原理,帮助开发者更好地理解其工作机制。


一、Java端的PreparedStatement创建

1.1 JDBC驱动的prepareStatement方法

当Java应用调用Connection.prepareStatement(sql)时,JDBC驱动(以MySQL Connector/J为例)根据配置决定使用服务器端预处理还是客户端模拟预处理

 
// 示例:MySQL Connector/J中的prepareStatement实现
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) {if (useServerPrepStmts && canServerPrepare(sql)) {return new ServerPreparedStatement(connection, sql); // 服务器端预处理} else {return new ClientPreparedStatement(connection, sql); // 客户端模拟}
}
  • 服务器端预处理(ServerPreparedStatement
    向MySQL发送COM_STMT_PREPARE命令,触发SQL解析与预处理,适用于高频重复查询。
  • 客户端模拟(ClientPreparedStatement
    直接将参数拼接到SQL中,以普通查询执行,适用于低频或复杂语句。
1.2 关键配置参数
  • useServerPrepStmts=true:启用服务器端预处理。
  • cachePrepStmts=true:缓存预处理语句,避免重复解析。

二、MySQL服务器的预处理阶段

2.1 处理COM_STMT_PREPARE命令

当JDBC驱动发送COM_STMT_PREPARE,MySQL调用mysqld_stmt_prepare函数:

 
// MySQL源码:sql/sql_prepare.cc
void mysqld_stmt_prepare(THD *thd, const char *query, uint length) {Prepared_statement *stmt = new Prepared_statement(thd);stmt->prepare(query, length); // 解析SQL并记录占位符thd->session->push_prepared_stmt(stmt); // 缓存预处理语句send_statement_id(thd, stmt->id); // 返回statement_id给客户端
}
2.2 解析SQL与占位符记录

Prepared_statement::prepare()中:

  1. 解析SQL生成语法树,识别?占位符。
  2. 为每个?创建Item_param对象,记录参数位置和类型。
  3. 存储参数数量(m_param_count)和元数据。
 
// 示例:Item_param对象存储参数信息
class Item_param {enum_field_types param_type; // 参数类型(如MYSQL_TYPE_STRING)String str_value;           // 字符串类型值longlong int_value;         // 整型值
};

三、参数绑定的底层实现

3.1 处理COM_STMT_EXECUTE命令

当Java调用PreparedStatement.execute()时,JDBC驱动发送COM_STMT_EXECUTE命令,携带statement_id和参数值:

 
// MySQL源码:sql/sql_prepare.cc
void mysqld_stmt_execute(THD *thd, Prepared_statement *stmt) {stmt->set_parameters(thd, parameters); // 绑定参数到Item_paramstmt->execute_loop(thd);               // 执行预处理语句
}
3.2 参数绑定过程
  1. 二进制协议解析:从网络包中读取参数值。
  2. 类型检查与转换:确保客户端参数类型与Item_param定义一致。
  3. 值存储:将参数值写入对应的Item_param对象。
 
// 示例:设置参数值
void Item_param::set_param_value(THD *thd, String *value) {if (param_type == MYSQL_TYPE_STRING) {str_value.copy(value->ptr(), value->length(), charset);} else if (param_type == MYSQL_TYPE_LONG) {int_value = parse_int(value);}
}

四、语句执行与结果返回

4.1 执行预处理语句

MySQL调用Prepared_statement::execute_loop()

  1. 替换占位符:使用Item_param中的值生成完整执行计划。
  2. 查询优化:可能使用二级引擎(如HeatWave)加速。
  3. 结果返回:通过二进制协议高效传输结果集。
4.2 性能优化点
  • 缓存执行计划:避免重复优化相同语句。
  • 二进制协议:减少网络开销,直接传输二进制数据。

五、Java与MySQL的协作全貌

  1. 初始化阶段
    Java调用prepareStatement() → MySQL解析SQL,返回statement_id
  2. 执行阶段
    Java传递参数 → MySQL绑定参数并执行 → 返回结果集。
  3. 资源清理
    关闭PreparedStatement时,发送COM_STMT_CLOSE释放资源。

六、最佳实践与注意事项

  1. 优先使用服务器端预处理:提升性能并防止SQL注入。
  2. 合理设置缓存大小:平衡内存与性能。
  3. 避免频繁开关连接:复用预处理语句减少解析开销。
  4. 监控预处理语句缓存命中率:优化prepStmtCacheSize参数。

结语

通过深入Java与MySQL源码,我们揭示了PreparedStatement从参数绑定到执行的全链路过程。这种底层视角不仅帮助开发者优化数据库操作,还能更好地应对高并发场景下的性能挑战。正确使用预处理语句,是编写高效、安全数据库应用的关键一步。

 ##java调用栈

 

 ##java堆栈

prepareStatement:1583, ConnectionImpl (com.mysql.cj.jdbc)
prepareStatement:1563, ConnectionImpl (com.mysql.cj.jdbc)
prepareStatement:369, DruidPooledConnection (com.alibaba.druid.pool)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
invoke:55, ConnectionLogger (org.apache.ibatis.logging.jdbc)
prepareStatement:-1, $Proxy83 (jdk.proxy3)
instantiateStatement:86, PreparedStatementHandler (org.apache.ibatis.executor.statement)
prepare:88, BaseStatementHandler (org.apache.ibatis.executor.statement)
prepare:59, RoutingStatementHandler (org.apache.ibatis.executor.statement)
prepareStatement:87, SimpleExecutor (org.apache.ibatis.executor)
doQuery:62, SimpleExecutor (org.apache.ibatis.executor)
queryFromDatabase:325, BaseExecutor (org.apache.ibatis.executor)
query:156, BaseExecutor (org.apache.ibatis.executor)
query:109, CachingExecutor (org.apache.ibatis.executor)
query:89, CachingExecutor (org.apache.ibatis.executor)
selectList:151, DefaultSqlSession (org.apache.ibatis.session.defaults)
selectList:145, DefaultSqlSession (org.apache.ibatis.session.defaults)
selectList:140, DefaultSqlSession (org.apache.ibatis.session.defaults)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
invoke:427, SqlSessionTemplate$SqlSessionInterceptor (org.mybatis.spring)
selectList:-1, $Proxy57 (jdk.proxy2)
selectList:224, SqlSessionTemplate (org.mybatis.spring)
executeForMany:166, MybatisMapperMethod (com.baomidou.mybatisplus.core.override)
execute:77, MybatisMapperMethod (com.baomidou.mybatisplus.core.override)
invoke:148, MybatisMapperProxy$PlainMethodInvoker (com.baomidou.mybatisplus.core.override)
invoke:89, MybatisMapperProxy (com.baomidou.mybatisplus.core.override)
selectList:-1, $Proxy72 (jdk.proxy2)
selectOne:172, BaseMapper (com.baomidou.mybatisplus.core.mapper)
invokeSpecialIFC:-1, LambdaForm$DMH/0x00000281814b8000 (java.lang.invoke)
invoke:-1, LambdaForm$MH/0x000002818127b000 (java.lang.invoke)
invoke:-1, LambdaForm$MH/0x00000281814b8800 (java.lang.invoke)
invokeExact_MT:-1, LambdaForm$MH/0x00000281814b8c00 (java.lang.invoke)
invokeWithArguments:732, MethodHandle (java.lang.invoke)
invoke:162, MybatisMapperProxy$DefaultMethodInvoker (com.baomidou.mybatisplus.core.override)
invoke:89, MybatisMapperProxy (com.baomidou.mybatisplus.core.override)
selectOne:-1, $Proxy72 (jdk.proxy2)
getOne:202, ServiceImpl (com.baomidou.mybatisplus.extension.service.impl)
getOne:320, IService (com.baomidou.mybatisplus.extension.service)
invoke:-1, IService$$FastClassBySpringCGLIB$$f8525d18 (com.baomidou.mybatisplus.extension.service)
invoke:218, MethodProxy (org.springframework.cglib.proxy)
invokeMethod:386, CglibAopProxy (org.springframework.aop.framework)
access$000:85, CglibAopProxy (org.springframework.aop.framework)
intercept:704, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
getOne:-1, SqlVerifyServiceImpl$$EnhancerBySpringCGLIB$$372ce03a (com.jf.equipment.service.impl)
getSqlVerify:24, SqlVerifyController (com.jf.equipment.controller)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
doInvoke:205, InvocableHandlerMethod (org.springframework.web.method.support)
invokeForRequest:150, InvocableHandlerMethod (org.springframework.web.method.support)
invokeAndHandle:117, ServletInvocableHandlerMethod (org.springframework.web.servlet.mvc.method.annotation)
invokeHandlerMethod:895, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handleInternal:808, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation)
handle:87, AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method)
doDispatch:1067, DispatcherServlet (org.springframework.web.servlet)
doService:963, DispatcherServlet (org.springframework.web.servlet)
processRequest:1006, FrameworkServlet (org.springframework.web.servlet)
doGet:898, FrameworkServlet (org.springframework.web.servlet)
service:655, HttpServlet (javax.servlet.http)
service:883, FrameworkServlet (org.springframework.web.servlet)
service:764, HttpServlet (javax.servlet.http)
internalDoFilter:227, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
doFilter:53, WsFilter (org.apache.tomcat.websocket.server)
internalDoFilter:189, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
doFilter:20, CorsFilter (com.jf.equipment.filter)
internalDoFilter:189, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:100, RequestContextFilter (org.springframework.web.filter)
doFilter:117, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:189, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:93, FormContentFilter (org.springframework.web.filter)
doFilter:117, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:189, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
doFilterInternal:201, CharacterEncodingFilter (org.springframework.web.filter)
doFilter:117, OncePerRequestFilter (org.springframework.web.filter)
internalDoFilter:189, ApplicationFilterChain (org.apache.catalina.core)
doFilter:162, ApplicationFilterChain (org.apache.catalina.core)
invoke:197, StandardWrapperValve (org.apache.catalina.core)
invoke:97, StandardContextValve (org.apache.catalina.core)
invoke:541, AuthenticatorBase (org.apache.catalina.authenticator)
invoke:135, StandardHostValve (org.apache.catalina.core)
invoke:92, ErrorReportValve (org.apache.catalina.valves)
invoke:78, StandardEngineValve (org.apache.catalina.core)
service:360, CoyoteAdapter (org.apache.catalina.connector)
service:399, Http11Processor (org.apache.coyote.http11)
process:65, AbstractProcessorLight (org.apache.coyote)
process:890, AbstractProtocol$ConnectionHandler (org.apache.coyote)
doRun:1743, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
run:49, SocketProcessorBase (org.apache.tomcat.util.net)
runWorker:1191, ThreadPoolExecutor (org.apache.tomcat.util.threads)
run:659, ThreadPoolExecutor$Worker (org.apache.tomcat.util.threads)
run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
run:842, Thread (java.lang)

##mysql8源码 mysqld_stmt_prepare方法gdb堆栈

(gdb) bt
#0  mysqld_stmt_prepare (thd=0x730d04166ce0, query=0x730d04007781 "SELECT  id,name,age  FROM t \n \n WHERE (name = ?)", length=48, stmt=0x730d04006880)at /home/yym/mysql8/mysql-8.1.0/sql/sql_prepare.cc:1550
#1  0x000060a668f30cf0 in dispatch_command (thd=0x730d04166ce0, com_data=0x730df85fe340, command=COM_STMT_PREPARE) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:2035
#2  0x000060a668f2ef77 in do_command (thd=0x730d04166ce0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1459
#3  0x000060a669186835 in handle_connection (arg=0x60a68e4b5420) at /home/yym/mysql8/mysql-8.1.0/sql/conn_handler/connection_handler_per_thread.cc:303
#4  0x000060a66b0c5bdc in pfs_spawn_thread (arg=0x60a68e246910) at /home/yym/mysql8/mysql-8.1.0/storage/perfschema/pfs.cc:3043
#5  0x0000730e08094ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#6  0x0000730e08126850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

##mysql8源码 mysqld_stmt_execute 方法gdb堆栈

(gdb) p stmt->m_query_string.str
$1 = 0x730d04bac5c8 "SELECT  id,name,age  FROM t \n \n WHERE (name = ?)"
(gdb) bt
#0  mysqld_stmt_execute (thd=0x730d04166ce0, stmt=0x730d04006880, has_new_types=true, execute_flags=8, parameters=0x730d04b6b9a0)at /home/yym/mysql8/mysql-8.1.0/sql/sql_prepare.cc:1888
#1  0x000060a668f309ab in dispatch_command (thd=0x730d04166ce0, com_data=0x730df85fe340, command=COM_STMT_EXECUTE) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1993
#2  0x000060a668f2ef77 in do_command (thd=0x730d04166ce0) at /home/yym/mysql8/mysql-8.1.0/sql/sql_parse.cc:1459
#3  0x000060a669186835 in handle_connection (arg=0x60a68e4b5420) at /home/yym/mysql8/mysql-8.1.0/sql/conn_handler/connection_handler_per_thread.cc:303
#4  0x000060a66b0c5bdc in pfs_spawn_thread (arg=0x60a68e246910) at /home/yym/mysql8/mysql-8.1.0/storage/perfschema/pfs.cc:3043
#5  0x0000730e08094ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#6  0x0000730e08126850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

相关文章:

从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制

引言 在数据库开发中&#xff0c;PreparedStatement&#xff08;预处理语句&#xff09;是防止SQL注入、提升性能的重要工具。它通过分离SQL结构与参数值&#xff0c;不仅增强了安全性&#xff0c;还能利用预编译优化执行效率。本文将从Java JDBC驱动和MySQL 8源码的双重视角&…...

mysql的主从同步

1、异步复制&#xff1a;这是MySQL默认的复制模式。在这种模式下&#xff0c;主库在执行完客户端提交的事务后会立即将结果返回给客户端&#xff0c;并不关心从库是否已经接收并处理。这种模式的优点是实现简单&#xff0c;但缺点是如果主库崩溃&#xff0c;已经提交的事务可能…...

工程化与框架系列(10)--微前端架构

微前端架构 &#x1f3d7;️ 微前端是一种将前端应用分解成更小、更易管理的独立部分的架构模式。本文将详细介绍微前端的核心概念、实现方案和最佳实践。 微前端概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;微前端的核心理念是将前端应用分解成一系列独立部署、松耦…...

【3天快速入门WPF】11-附加属性

目录 1. 步骤1:定义附加属性2. 示例代码3. 步骤2:在XAML中使用附加属性3.1. 示例代码4. 步骤3:扩展使用场景4.1. 示例代码5. 总结上一篇讲到了依赖属性,本篇主要想说一下附加属性。 在WPF中,附加属性(Attached Property)是一种特殊的依赖属性,允许你在不属于某个类的控…...

MySQL并发知识(面试高频)

mysql并发事务解决 不同隔离级别下&#xff0c;mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。 1. mysql中的锁有哪些&#xff1f; 表级锁&#xff1a; 场景&#xff1a;表级锁适用于需要对整个表进行操作的情况&#xff0c;例如…...

现存脑容知识库

Redis import queue import threading import asyncio 异步&#xff1a;在一个线程内&#xff0c;等待的时候可以切换到其他任务。 多线程&#xff1a;每个线程独立运行&#xff0c;同时处理多个任务。 回调函数 网络请求&#xff08;JavaScript&#xff09;在浏览器中&a…...

Mysql-如何理解事务?

一、事务是什么东西 有些场景中&#xff0c;某个操作需要多个sql配合完成&#xff1a; 例如&#xff1a; 李四这个月剩下的前不够交房租了&#xff0c;找张三借1000元急用&#xff1a; &#xff08;1&#xff09;给张三的账户余额 减去1000元 updata 账户表 set money money -…...

dify绑定飞书多维表格

dify 绑定飞书和绑定 notion 有差不多的过程&#xff0c;都需要套一层应用的壳子&#xff0c;而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用&#xff0c;个人用户创建企业自建应用。 自定义应…...

QT播放视频保持视频宽高比消除黑边

QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候&#xff0c;由于框架的大小发生变化&#xff0c;导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定&#xff0c;Widget的宽高比和视频宽高比…...

1. IO的基础知识

1.1 流 Java程序通过流执行IO。流是一种抽象&#xff0c;它要么生成信息&#xff0c;要么使用信息。流通过java的IO系统链接到物理设备。所有流的行为方式都是相同的&#xff0c;尽管它们链接的物理设备是不同的。 1.2 字节流和字符流 Java定义了两种类型的流 : 字节流和字符流…...

科普:ROC AUC与PR AUC

在评价二分类模型性能时&#xff0c;有许多评价指标&#xff0c;其中&#xff0c;有一对是用面积AUC&#xff08;Area Under the Curve&#xff09;做评价的&#xff1a;ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析&#xff1a; 一、定义与核心原理 维度RO…...

Vue3父组件访问子组件方法与属性完全指南

在Vue3的组件化开发中&#xff0c;父子组件间的通信是核心功能之一。本文将详细介绍五种父组件访问子组件属性/方法的实现方案&#xff0c;包含最新的<script setup>语法糖实践。&#xff08;综合1579&#xff09; 一、ref defineExpose&#xff08;推荐方案&#xff0…...

AI时代保护自己的隐私

人工智能最重要的就是数据&#xff0c;让我们面对现实&#xff0c;大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录&#xff0c;你发出的每条语音命令&#xff0c;人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com)&#xff0c…...

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…...

TCP长连接与短连接

TCP长连接与短连接 TCP&#xff08;传输控制协议&#xff09;中的长连接和短连接是两种不同的连接管理方式&#xff0c;各有优缺点&#xff1a; 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时&#xff0c;再重新建立连接。 特点&#xff1…...

C#委托(delegate)的常用方式

C# 中委托的常用方式&#xff0c;包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);&#xff1a;定义了一个公共委托类型 …...

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…...

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…...

Sqlserver安全篇之_TLS的证书概念

证书的理解 参考Sqlserver的官方文档https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)传输层安全和SSL(Secure Sockets Layer)安全套接字层协议位于应用程序协议层和TCP/…...

Kafka生产者相关

windows中kafka集群部署示例-CSDN博客 先启动集群或者单机也OK 引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.9.0</version></dependency>关于主题创建 理论…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...