基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
1. 输出关键信息的代码示例
日志记录方法
使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈:
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class GrpcChannelPoolAnalyzer {private static final Logger logger = LoggerFactory.getLogger(GrpcChannelPoolAnalyzer.class);private final GenericObjectPool<GrpcChannel> grpcChannelPool;public GrpcChannelPoolAnalyzer(GenericObjectPool<GrpcChannel> grpcChannelPool) {this.grpcChannelPool = grpcChannelPool;}public void logPoolStatus() {logger.info("=== GrpcChannelPool Status ===");logger.info("Num Active: {}", grpcChannelPool.getNumActive());logger.info("Num Idle: {}", grpcChannelPool.getNumIdle());logger.info("Num Waiters: {}", grpcChannelPool.getNumWaiters());logger.info("Total Borrowed Count: {}", grpcChannelPool.getBorrowedCount());logger.info("Total Created Count: {}", grpcChannelPool.getCreatedCount());logger.info("Total Returned Count: {}", grpcChannelPool.getReturnedCount());logger.info("Total Destroyed Count: {}", grpcChannelPool.getDestroyedCount());}
}
调用日志记录
public static void main(String[] args) {// 创建连接池GenericObjectPool<GrpcChannel> grpcChannelPool = new GenericObjectPool<>(new GrpcChannelFactory());// 初始化分析器GrpcChannelPoolAnalyzer analyzer = new GrpcChannelPoolAnalyzer(grpcChannelPool);// 定期输出日志analyzer.logPoolStatus();
}
2. 关键方法的含义和影响分析
A. getBorrowedCount()
- 含义:
- 自池创建以来,成功借出的对象总数。
- 表示连接池处理了多少次借用请求。
- 可能的影响:
- 如果
getBorrowedCount
很高,说明连接池被频繁借用。这可能导致以下问题:- 如果连接池配置的
maxTotal
过低,导致线程排队等待可用连接。 - 如果池中连接被频繁销毁或验证失败,导致额外的连接创建开销。
- 如果连接池配置的
- 借用连接时慢可能是由于等待连接归还或新建连接的时间过长。
- 如果
B. getCreatedCount()
- 含义:
- 自池创建以来,总共创建的对象数量。
- 包括了所有当前活跃、空闲和已销毁的对象。
- 可能的影响:
- 如果
getCreatedCount
很高,表明连接池频繁创建新连接,可能是因为:- 空闲连接销毁过快:池中配置了较小的
maxIdle
或空闲对象检测频率较高,导致连接被频繁销毁。 - 验证失败:连接在借用时被标记为无效,从而需要创建新连接。
- 连接使用时间长:池内的连接未及时归还,导致新连接不断创建。
- 空闲连接销毁过快:池中配置了较小的
- 借用连接时慢可能是由于新连接创建速度较慢(如涉及网络请求、SSL 加密等复杂逻辑)。
- 如果
C. getNumActive()
- 含义:
- 当前正在被使用的连接数。
- 可能的影响:
- 如果
getNumActive
接近或等于maxTotal
:- 新的借用请求将被阻塞,等待有连接归还或新建。
- 借用延迟的时间取决于前一个连接释放的速度或新连接创建时间。
- 如果
D. getNumIdle()
- 含义:
- 当前池中空闲的连接数。
- 可能的影响:
- 如果
getNumIdle
为 0,意味着没有可立即借用的连接。 - 此时,借用请求会被阻塞,直到:
- 一个连接被归还。
- 一个新连接被创建。
- 借用连接时慢通常与空闲连接耗尽直接相关。
- 如果
E. getNumWaiters()
- 含义:
- 当前等待借用连接的线程数。
- 可能的影响:
- 如果等待线程数较多,表明连接池无法及时满足请求。
- 这种情况可能因为
maxTotal
设置过低或连接释放速度过慢导致。
F. getDestroyedCount()
- 含义:
- 自池创建以来,被销毁的连接总数。
- 可能的影响:
- 如果销毁的连接数较高,可能导致借用连接时需要频繁创建新连接,从而增加延迟。
- 检查空闲对象的检测配置是否合理(如
timeBetweenEvictionRunsMillis
和minEvictableIdleTimeMillis
)。
3. 借用对象慢的分析原因
根据以上信息,以下是常见可能的原因及解决方案:
原因 1:空闲连接不足
- 表现:
getNumIdle
为 0。 - 分析:池中没有空闲连接供借用,新的借用请求需要等待归还或创建新连接。
- 解决方案:
- 增加
minIdle
和maxIdle
,确保有足够的空闲连接。 - 减少连接创建的开销(优化
makeObject()
方法)。
- 增加
原因 2:线程等待超时
- 表现:
getNumWaiters
高,getNumActive
接近或等于maxTotal
。 - 分析:借用请求太多,超过了池的最大容量。
- 解决方案:
- 增加
maxTotal
,允许池处理更多并发连接。 - 优化业务逻辑,减少连接使用时间。
- 增加
原因 3:连接频繁销毁和创建
- 表现:
getCreatedCount
和getDestroyedCount
较高。 - 分析:可能因连接超时、验证失败或空闲销毁策略不合理导致。
- 解决方案:
- 调整连接池的空闲销毁参数(如
timeBetweenEvictionRunsMillis
和minEvictableIdleTimeMillis
)。 - 优化连接验证逻辑,减少验证失败的情况。
- 调整连接池的空闲销毁参数(如
原因 4:连接创建耗时
- 表现:
getNumActive
达到maxTotal
,getNumIdle
为 0。 - 分析:新连接的创建时间太长,可能因网络延迟、认证复杂或初始化慢。
- 解决方案:
- 优化连接的创建过程(减少网络调用、使用连接池化资源)。
- 预热池:配置
minIdle
和定期检测任务。
4. 日志输出与示例分析
假设运行时日志输出如下:
INFO - === GrpcChannelPool Status ===
INFO - Num Active: 10
INFO - Num Idle: 0
INFO - Num Waiters: 95
INFO - Total Borrowed Count: 500
INFO - Total Created Count: 520
INFO - Total Destroyed Count: 10
分析
-
Num Idle = 0
- 空闲连接不足,导致新的借用请求需要等待。
-
Num Waiters = 95
- 表示 95 个线程正在等待借用连接,系统压力较大。
-
Total Created Count = 520,Total Destroyed Count = 10
- 表明创建频率高,销毁频率低,可能是空闲检测频率较低或借用时触发新连接的创建逻辑。
解决方案
- 增加
maxTotal
(如 50)。 - 设置合理的
minIdle
(如 10)并启用预热机制。 - 优化连接创建速度,减少延迟。
5. 如何获取 maxTotal
与其关系
获取 maxTotal
的方法
maxTotal
是连接池中可同时活跃对象的最大数量。在 Apache Commons Pool 中,通过 GenericObjectPoolConfig
设置并管理此参数。
获取 maxTotal
的代码
如果你有一个 GenericObjectPool
实例,可以通过以下代码获取 maxTotal
的值:
int maxTotal = grpcChannelPool.getMaxTotal();
System.out.println("Max Total: " + maxTotal);
maxTotal
与 NumActive
的关系
定义
-
maxTotal
:- 定义了连接池中允许同时活跃的最大对象数量。
- 当活跃对象数量达到
maxTotal
时,新的借用请求会被阻塞,直到有对象归还或超时。
-
NumActive
:- 表示当前池中被借用(活跃使用)的对象数量。
NumActive
的值始终小于或等于maxTotal
。
关系描述
-
NumActive ≤ maxTotal
:NumActive
是当前实际使用的对象数量,受maxTotal
的限制。- 如果
NumActive
达到maxTotal
,连接池不会再创建新对象,而是让新的请求进入等待状态。
-
连接池满的场景:
- 当
NumActive == maxTotal
且NumIdle == 0
时,连接池满载,新的借用请求将进入等待队列,直到有对象被归还或超时。
- 当
-
调整
maxTotal
的影响:- 增加
maxTotal
:允许池支持更多并发请求,但需要足够的系统资源(如数据库连接数)。 - 减少
maxTotal
:限制池的最大并发能力,可能导致更多请求进入等待队列。
- 增加
示例分析
代码示例
以下代码展示如何获取 maxTotal
和检查其与 NumActive
的关系:
import org.apache.commons.pool2.impl.GenericObjectPool;public class PoolStatusChecker {public static void logPoolStatus(GenericObjectPool<?> pool) {int maxTotal = pool.getMaxTotal();int numActive = pool.getNumActive();int numIdle = pool.getNumIdle();System.out.println("Max Total: " + maxTotal);System.out.println("Num Active: " + numActive);System.out.println("Num Idle: " + numIdle);if (numActive == maxTotal && numIdle == 0) {System.out.println("Connection pool is at full capacity.");}}
}
运行结果示例
假设运行时的池状态如下:
Max Total: 10
Num Active: 10
Num Idle: 0
分析:
- 当前活跃连接数
NumActive = 10
已经达到maxTotal
。 - 此时,如果有新的借用请求,将进入等待队列,可能导致延迟。
总结
maxTotal
定义了池中最大同时活跃对象的数量,而NumActive
是当前实际使用的对象数量。NumActive
始终小于或等于maxTotal
,当NumActive == maxTotal
且NumIdle == 0
时,新的借用请求将进入等待状态。- 根据业务需求动态调整
maxTotal
,并结合NumActive
和NumWaiters
的监控数据,优化连接池配置。
GrpcChannelPool 性能分析与数学关系
1. 关键值的意义和关系
活跃连接数 (NumActive
)
- 当前正在使用的连接数量。
NumActive ≤ maxTotal
(活跃连接不能超过最大连接数)。
空闲连接数 (NumIdle
)
- 当前池中未被使用的连接数量。
NumIdle + NumActive ≤ maxTotal
(空闲和活跃连接之和不能超过池中允许的最大连接数)。
等待线程数 (NumWaiters
)
- 当前等待借用连接的线程数。
- 当
NumActive == maxTotal
且NumIdle == 0
时,新的请求进入等待队列,此时NumWaiters > 0
。
最大连接数 (maxTotal
)
- 池中允许的最大同时活跃连接数。
- 限制了
NumActive
和NumIdle
的上限。
2. 累积统计值
借用总数 (Total Borrowed Count
)
- 表示自池创建以来成功借出的对象总数。
Total Borrowed Count ≥ NumActive
(历史借用次数必然大于或等于当前活跃数)。
创建总数 (Total Created Count
)
- 表示自池创建以来创建的对象总数。
Total Created Count ≥ NumActive + NumIdle
(当前池中活跃和空闲连接数量必须由创建的连接数提供)。
归还总数 (Total Returned Count
)
- 表示自池创建以来归还的对象总数。
Total Returned Count = Total Borrowed Count - NumActive
(归还的连接数等于借用总数减去当前未归还的活跃连接数)。
销毁总数 (Total Destroyed Count
)
- 表示自池创建以来销毁的对象总数。
Total Destroyed Count = Total Created Count - (NumActive + NumIdle)
(销毁的连接数等于创建的连接数减去池中当前剩余的活跃和空闲连接)。
3. 主要数学运算关系
4. 示例分析
假设运行时池的状态如下:
maxTotal = 10
NumActive = 6
NumIdle = 2
NumWaiters = 3
Total Borrowed Count = 50
Total Created Count = 15
Total Returned Count = 44
Total Destroyed Count = 7
验证数学关系:
5. 如何利用这些关系分析性能问题
通过以上数学关系,可以监控和诊断连接池的问题。例如:
池容量不足
- 表现:
- 如果
NumActive + NumIdle
长期接近或等于maxTotal
,且NumWaiters > 0
。
- 如果
- 原因:
- 连接池容量不足,导致大量线程排队。
- 解决方案:
- 增加
maxTotal
。
- 增加
连接泄漏
- 表现:
- 如果
Total Borrowed Count - Total Returned Count ≠ NumActive
。
- 如果
- 原因:
- 存在未归还的连接。
- 解决方案:
- 检查业务代码,确保每次借用的连接都正确归还。
连接频繁创建销毁
- 表现:
- 如果
Total Destroyed Count
很高。
- 如果
- 原因:
- 连接被频繁销毁,可能是因为空闲策略不合理。
- 解决方案:
- 调整
minIdle
和空闲销毁参数。
- 调整
6. 总结
这些值之间的数学关系提供了诊断连接池运行状态的重要依据。通过监控和分析这些关系,可以:
- 优化连接池的配置(如
maxTotal
、minIdle
等)。 - 发现性能瓶颈(如等待时间过长、连接不足等)。
- 及时修复问题(如连接泄漏或资源浪费)。
GrpcChannelPool 预热机制详解
1. 预热机制的概念
预热机制是指在连接池启动时或者空闲连接不足时,预先创建一定数量的连接(由 minIdle
参数指定),以确保在请求到来时能够快速响应,避免因为连接创建而导致延迟。
在 Apache Commons Pool 中,预热机制通过以下参数实现:
minIdle
: 定义了连接池中保持的最小空闲连接数。如果空闲连接少于这个值,连接池会主动补充连接。timeBetweenEvictionRunsMillis
: 定义了空闲对象检测线程的运行周期。如果设置了该值,后台线程会定期运行,确保空闲连接数不低于minIdle
。numTestsPerEvictionRun
: 定义每次检测时要检查的对象数量。
2. 如何启用预热机制
步骤 1: 设置 minIdle
- 定义连接池的最小空闲连接数。例如,如果你的系统需要至少保持 5 个连接可以快速响应:
poolConfig.setMinIdle(5);
步骤 2: 启用空闲检测线程
- 设置
timeBetweenEvictionRunsMillis
,让连接池定期检查和补充空闲连接。例如:poolConfig.setTimeBetweenEvictionRunsMillis(10000); // 每 10 秒运行一次检测任务
步骤 3: 确保足够的空闲连接
- 设置
numTestsPerEvictionRun
,控制每次检测的对象数量。通常设置为一个较大的值(如-1
,表示检测所有对象):poolConfig.setNumTestsPerEvictionRun(-1);
可选参数
testWhileIdle
:- 如果设置为
true
,连接池会在补充空闲连接时验证连接是否有效。 - 适合场景:如果连接容易失效(例如网络中断),启用此参数可提高连接池的可靠性。
- 如果设置为
3. 完整的预热机制代码示例
以下是一个示例,展示如何为连接池启用预热机制:
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class GrpcChannelPoolConfig {public static GenericObjectPoolConfig<Object> createConfig() {GenericObjectPoolConfig<Object> poolConfig = new GenericObjectPoolConfig<>();// 设置连接池大小poolConfig.setMaxTotal(50); // 最大连接数poolConfig.setMinIdle(5); // 最小空闲连接数poolConfig.setMaxIdle(10); // 最大空闲连接数// 启用预热机制poolConfig.setTimeBetweenEvictionRunsMillis(10000); // 每 10 秒检测一次poolConfig.setNumTestsPerEvictionRun(-1); // 每次检测所有对象poolConfig.setTestWhileIdle(true); // 检查空闲连接有效性return poolConfig;}
}
4. 预热机制的优点
- 减少首次延迟:在请求到达前已创建好足够的连接,无需等待连接创建。
- 提高系统响应能力:尤其在负载波动较大的场景下,预热机制能缓解连接不足的问题。
- 提升可靠性:通过定期检测和补充空闲连接,确保池中连接始终处于健康状态。
5. 注意事项
-
监控连接数量:
- 如果设置了过大的
minIdle
,可能导致资源浪费(如内存、数据库连接等)。 - 建议通过监控工具(如 JMX)观察实际连接使用情况,动态调整参数。
- 如果设置了过大的
-
创建时间消耗:
- 如果连接创建耗时较长(如 SSL 或远程服务连接),建议适当增加
timeBetweenEvictionRunsMillis
的间隔,避免频繁创建。
- 如果连接创建耗时较长(如 SSL 或远程服务连接),建议适当增加
-
避免过度销毁:
- 配置
maxIdle
和minIdle
的差距不宜过大,防止频繁的连接创建和销毁。
- 配置
6. 总结
预热机制的核心是通过配置 minIdle
和空闲检测线程定期补充连接,以确保空闲连接数不低于 minIdle
。启用预热机制的关键配置是:
setMinIdle
:定义最小空闲连接数。setTimeBetweenEvictionRunsMillis
:定期检测周期。- 可选:启用
testWhileIdle
提高连接有效性检测。
这些参数协同工作,可以显著提高连接池的性能和响应能力。
相关文章:
基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…...
微信小程序实现登录注册
文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式: https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…...
网络安全-kail linux 网络配置(基础篇)
一、网络配置 1.查看网络IP地址, 我的kail:192.168.15.128 使用ifconfig查看kail网络连接情况,ip地址情况 又复制了一台kail计算机的IP地址。 再看一下windows本机:使用ipconfig进行查看: 再看一下虚拟机上的win7I…...
Lua语言的软件工程
Lua语言的软件工程 引言 在软件工程领域,编程语言的选择对项目的成功与否有着至关重要的影响。Lua语言作为一种轻量级、高效、可扩展的脚本语言,近年来在游戏开发、嵌入式系统以及其他高性能应用程序中得到了广泛应用。本文将深入探讨Lua语言的特点、优…...
【Rust自学】11.4. 用should_panic检查恐慌
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.4.1. 验证错误处理的情况 测试函数出了验证代码的返回值是否正确,还需要验证…...
基于深度模型的印章检测(c++)
效果展示: 有点: (1)快速(几十毫秒级别); (2)精度高; int main() {std::string imagePath;// 提示用户输入图像路径std::cout << "请输入图像路…...
C#Struct堆栈
Struct若其内部含有堆对象,Struct的该对象放在堆上; Struct当做参数传递时,其堆属性作为引用传递,值属性还是作为值传递; struct TS { public int[] t1; public int t2; } public void TF1(TS t) { int[] t1 t.t1; …...
STM32之一种双通路CAN总线消息备份冗余处理方法(十三)
STM32F407 系列文章 - Dual-CANBus-ProMethod(十三) 目录 前言 一、现状分析 二、解决思路 1.应用场景网络结构图 2.数据发送流程 3.数据接收流程 4.用到的模块 1.CAN网络速率及时间片分配 2.CAN网络消息ID组成 3.设备节点定义 4.数据格式说明…...
深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例&a…...
客户端 ORA-12537: TNS: 连接已关闭
现象: 1、双节点数据库. 2、客户端连接 db1 正常 3、客户端连接db2 显示:ORA-12537: TNS: 连接已关闭 4、数据库正常启动 5、lsnrctl status 检查 监听正常 6、lsnrctl stop/start 重启监听正常 过程: 冲浪 查看网友的解决方法。 连接&…...
.net开发环境安装配置以及程序发布 详细教程
文章目录 一、安装visual studio1.1推荐win10操作系统1.2推荐vs20221.3选择工作负载 二、新建基于.net的winform应用程序2.1为什么要.net 2.22.2.1 选择Window窗体应用 三、发布.net应用 一、安装visual studio 1.1推荐win10操作系统 1.2推荐vs2022 社区版、专业版、企业版都…...
盛最多水的容器
一、题目 给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。也就是求x轴与y轴的面积。 说明:你不能倾…...
spring boot解决swagger中的v2/api-docs泄露漏洞
在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前: 处理后:...
MySQL和Hive中的行转列、列转行
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 MySQL1.行转列2.列转行 Hive1.行转列2.列转行(1)侧窗(2)union MySQL 1.行转列 把多行转成列。直接group,sum(if()) 2.列转行 Hive 1.行转列 select name,sum(if(kmshuxu…...
【关于 vite 使用plugin-legacy兼容低版本浏览器仍出现的问题的情况】
项目使用了vitevue3ts的方案,采用plugin-legacybabel适配低版本浏览器 在开发工作中,项目使用了vitevue3ts的方案,但是需要适配低版本浏览器。首先使用了vitejs/plugin-legacy插件,配置完成后发现并不能解决问题, 出现…...
【集成学习】Bagging算法详解及代码实现
文章目录 1. Bagging集成学习算法1.1 简介1.2 基本步骤1.3 Bagging优缺点1.4 随机森林:Bagging的一个重要应用1.5 总结 2. Python代码实现3. 如何理解偏差与方差3.1 偏差(Bias)3.2 方差(Variance)3.3 方差与偏差的权衡…...
HTML5实现好看的中秋节网页源码
HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…...
OBS Zoom to Mouse 脚本安装与使用指南
前言:OBS有两个不错的放大插件,经过多台电脑测试发现,唯一好用的就是下面介绍的obs-zoom-to-mouse.lua这个插件,因为它安装简单,不需要python,设置更人性化性价比极高。 zoom_and_follow_mouse.py 这个pyth…...
使用codeblock+wxwidgets做的界面,运行时额外出现了一个cmd窗口
如何不让cmd窗口出现? 定位到Workspace project,选择菜单Project->Properties 将Type从Console application改为GUI application, 然后rebuild 这个project 之后再运行就没有cmd窗口了: 原因是在创建Project的时候选择了console mode application, 可…...
AI眼镜赛马,谁是C位,谁在边缘?
CES2025正在火热开展,智能眼镜成为最受关注的赛道之一。 去年8月,Meta曾一枝独秀引领AI眼镜爆发了一次大行情,带动AI眼镜市场百花齐放,近几个月更是爆发新品潮。 据悉,包括国内的雷神科技、恺英网络投资的乐相科技&a…...
Linux中彻底卸载Oracle 19.25单实例数据库
Linux中彻底卸载Oracle 19.25单实例数据库 1、关闭数据库实例2、关闭数据库监听3、执行deinstall卸载脚本4、删除相关目录5、删除数据库相关的用户和组 1、关闭数据库实例 su - oracle sqlplus / as sysdba shutdown immediate2、关闭数据库监听 su - oracle lsnrctl stop3、…...
分享:osgb倾斜数据转cesium-3dtiles 小工具.
背景: 很多知识殊途同归,在三维软件这块,少不了要和各种各样的数据格式打交道.osgb,stl,obj,3dtiles,3ds等等..虽然里面本质核心基本都是几何数据拓扑数据材质纹理数据等等,但是由于其组织方式不同和特殊的应用场景,导致很多模型需要转来转去...相信很多人在这方面都或多或少吃…...
基于单片机的客车载客状况自动检测系统(论文+源码)
1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…...
Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问
在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…...
中国省级产业结构高级化及合理化数据测算(2000-2023年)
一、数据介绍 数据名称:中国省级产业结构高级化、泰尔指数 数据年份:2000-2023年 数据范围:31个省份 数据来源:中国统计年鉴、国家统计局 数据整理:内含原始版本、线性插值版本、ARIMA填补版本 数据说明…...
云手机 —— 手机矩阵的 “超级外挂
如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先,明确打造手机矩阵的目的和需求,是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...
Ruby语言的编程范式
Ruby语言的编程范式 在软件开发的世界里,编程语言不仅仅是实现功能的工具,更是一种表达思想和解决问题的方式。Ruby语言凭借其简洁优雅的语法和强大的功能,广受开发者喜爱,并逐步形成了一种独特的编程范式。本文将深入探讨Ruby语…...
【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...
STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
一)问题:用ULINK2给STM32F103C8T6下载程序,下载方式设置如下: 出现下面两个问题: 1)下载问题界面如下: 这个错误的信息大概可以理解为,在0x08000063地址上读取到flash存储为FF&am…...
图像分割综述
1. 简述 图像分割(Image Segmentation)是计算机视觉领域中的一项基本任务,旨在将图像划分为多个具有语义或视觉意义的区域。这项任务在医学影像分析、自动驾驶、遥感图像处理、视频监控等领域都有着广泛的应用。随着深度学习技术的发展&…...
计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
STM32-笔记38-I2C-oled实验
一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…...
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…...
Android NDK开发实战之环境搭建篇(so库,Gemini ai)
文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库,涉及到底层的语⾳,视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…...
Word中所有的通配符使用方式[Word如何批量删除中文标点符号,英文标点符号,英文字母符号,数字符号,中文汉字符号]
Word中所有的通配符使用方式 概念讲解通配符一览表详细介绍通配符的使用使用通配符搜索简洁通配符链接操作演示链接 概念讲解 Word中的通配符是用在查找和替换中的正则表达式。通配符可以实现高级的查找替换,快速整理和排版文档。常用的通配符包括: “*…...
ElasticSearch内存占用率过高怎么办?
文章目录 1,先用top看看各个进程的内存占用情况2,不能简单的杀死进程,然后再重启。3,查看一下ElasticSearch进程的具体启动情况4,修改Elasticsearch 的Java堆内存 1,先用top看看各个进程的内存占用情况 先…...
svelte5中使用react组件
在svelet5中导入并使用react组件库 svelte5中使用react组件 svelte5中使用react组件 在svelet5中导入并使用react组件库, 示例项目地址:https://github.com/shenshouer/my-svelte-react 在svelte5中当前还有问题,无法将children传递到react中渲染 使用…...
Linux 文件的特殊权限—ACL项目练习
本文为Ubuntu Linux操作系统- 第二十一期~~ 上期回顾: 【ACL权限控制详解】 更多Linux 相关内容请点击👉【Linux专栏】~ 主页:【练小杰的CSDN】 文章目录 项目项目要求具体的设置命令如下问题2问题3第一步:设置默认ACL前,在projec…...
游戏引擎学习第76天
确保一切正常并计划今天的内容 在本次开发中,我们正在集中精力处理引擎中的三维功能,尤其是如何有效地处理多层结构,比如在多个楼层之间行走,或者在房间上方可以看到下方的房间。我们的目标是避免使用临时解决方案或黑客方式&…...
【Linux-多线程】POSIX信号量-基于环形队列生产消费模型
POSIX信号量 POSIX信号量和System V信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源的目的。但POSIX可以用于线程间同步 1.快速认识信号量接口 POSIX信号量分为两种类型: 命名信号量(Named Semaphores)&…...
电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)
电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...
1688平台商品关键词搜索的多样性与Python爬虫应用实践
在当今这个信息化、数字化飞速发展的时代,电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,凭借其庞大的商品种类和丰富的供应链资源,为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…...
2025年:AI化浪潮中的社会变迁与商业革新
随着人工智能(AI)技术的迅猛发展,2025年将成为一个转折点。这一年,AI不仅将深入到日常生活和商业运营的各个角落,还将引发一系列深刻的社会、经济和技术变革。以下是对未来一年可能出现的“AI化”现象的预测与展望。 AI进入主流文化的标志 超级碗广告:在2025年的超级碗上…...
JS scrollIntoView 技巧揭秘:解锁网页流畅交互
文章目录 一.基本概念二.语法和参数基本语法:element.scrollIntoView();参数详解: 三.应用场景和示例场景一:点击目录点位到相应的位置React 示例代码:Vue3 示例代码: 场景二:轮播图定位到指定图片示例代码…...
精选2款.NET开源的博客系统
前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…...
1.CSS的复合选择器
1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素(标签) 复…...
sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)
文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…...
gitee 使用教程
前言 Gitee 是一个中国的开源代码托管平台,类似于 GitHub,旨在为开发者提供一个高效、稳定、安全的代码管理和协作开发环境。Gitee 支持 Git 协议,可以托管 Git 仓库,进行版本控制、代码协作、项目管理等操作。 1. Gitee 的主要…...
HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计
结构清晰,层层递进 课程从基础知识(如HTML学前必知)开始,逐步深入到高级应用(如PWA配置和WebApp优化)。每个模块都有明确的目标,适合零基础学员逐步掌握HTML。 覆盖范围广 这套课程涵盖了HTM…...
嵌入式系统 (2.嵌入式硬件系统基础)
2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构:前者指令和数据共享同一存储空间…...