在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
1. GrpcChannel 的概念
GrpcChannel
是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多个请求。
特点
- 高消耗:创建 gRPC 通道可能涉及 DNS 解析、SSL 握手、连接认证等,耗时较高。
- 长连接:gRPC 通道是长连接,在生命周期内可以复用。
- 线程安全:gRPC 通道是线程安全的,多个线程可以共享一个通道发送请求。
2. 为什么需要 GrpcChannelPool
在高并发场景中,如果每个请求都创建一个新的 GrpcChannel
,会导致以下问题:
- 资源消耗大:频繁创建和销毁通道会增加系统开销(如网络连接、CPU 和内存使用)。
- 性能瓶颈:SSL 握手、认证等操作可能导致响应时间变长。
- 连接浪费:大多数情况下,一个 gRPC 通道可以复用多个请求。
为了解决上述问题,引入连接池管理 GrpcChannel
,实现通道的复用。
3. GrpcChannelPool 的作用
GrpcChannelPool
的主要功能是:
- 通道复用:通过复用
GrpcChannel
,减少创建和销毁的开销。 - 资源管理:限制活跃和空闲连接的数量,避免资源耗尽。
- 性能优化:通过预热和连接验证机制,确保请求的响应速度和可靠性。
4. GrpcChannelPool 的实现
实现方式
GrpcChannelPool
通常基于 Apache Commons Pool,使用 GenericObjectPool
来管理连接池。以下是主要组件:
-
GrpcChannelFactory:
- 实现
PooledObjectFactory<GrpcChannel>
接口。 - 负责创建、销毁和验证
GrpcChannel
。
- 实现
-
GenericObjectPool:
- 提供连接池的核心功能,包括对象的借用(
borrowObject
)、归还(returnObject
)、空闲检测等。
- 提供连接池的核心功能,包括对象的借用(
代码示例
1. 定义 GrpcChannelFactory
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;public class GrpcChannelFactory implements PooledObjectFactory<ManagedChannel> {private final String target;public GrpcChannelFactory(String target) {this.target = target;}@Overridepublic PooledObject<ManagedChannel> makeObject() {ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();return new DefaultPooledObject<>(channel);}@Overridepublic void destroyObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();channel.shutdown();}@Overridepublic boolean validateObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();return !channel.isShutdown() && !channel.isTerminated();}@Overridepublic void activateObject(PooledObject<ManagedChannel> p) {// 可选的激活逻辑}@Overridepublic void passivateObject(PooledObject<ManagedChannel> p) {// 可选的钝化逻辑}
}
2. 配置 GrpcChannelPool
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class GrpcChannelPool {private final GenericObjectPool<ManagedChannel> pool;public GrpcChannelPool(String target) {GrpcChannelFactory factory = new GrpcChannelFactory(target);GenericObjectPoolConfig<ManagedChannel> config = new GenericObjectPoolConfig<>();config.setMaxTotal(50); // 最大活跃连接数config.setMinIdle(5); // 最小空闲连接数config.setMaxIdle(10); // 最大空闲连接数config.setTimeBetweenEvictionRunsMillis(30000); // 空闲检测周期config.setTestOnBorrow(true); // 借用时验证config.setTestWhileIdle(true); // 空闲时验证pool = new GenericObjectPool<>(factory, config);}public ManagedChannel borrowChannel() throws Exception {return pool.borrowObject();}public void returnChannel(ManagedChannel channel) {pool.returnObject(channel);}
}
3. 使用 GrpcChannelPool
public class GrpcClient {public static void main(String[] args) throws Exception {GrpcChannelPool channelPool = new GrpcChannelPool("localhost:50051");// 借用一个通道ManagedChannel channel = channelPool.borrowChannel();// 使用通道发送 gRPC 请求// 示例代码:// MyGrpcServiceGrpc.MyGrpcServiceBlockingStub stub = MyGrpcServiceGrpc.newBlockingStub(channel);// stub.myRpcMethod();// 归还通道channelPool.returnChannel(channel);}
}
5. GrpcChannelPool 的参数配置
maxTotal
:最大活跃连接数,限制并发连接的数量。minIdle
:最小空闲连接数,确保有预热的连接可以立即使用。maxIdle
:最大空闲连接数,避免空闲连接占用过多资源。timeBetweenEvictionRunsMillis
:空闲检测周期,定期清理无效连接。testOnBorrow
:借用连接时验证有效性,避免借用无效连接。testWhileIdle
:空闲检测时验证连接有效性,确保空闲连接的健康状态。
6. GrpcChannelPool 的优点
-
提高性能:
- 减少频繁创建和销毁 gRPC 通道的开销。
- 确保在高并发场景下能够快速响应。
-
降低资源消耗:
- 通过复用通道和限制连接数量,避免资源浪费。
-
增强可靠性:
- 通过验证和检测机制,确保连接池中的通道始终处于健康状态。
-
支持动态调整:
- 根据负载情况灵活调整池的大小,满足不同场景需求。
7. GrpcChannelPool 在调用 borrowObject
时触发的方法
在调用 borrowObject
方法时,可能触发以下方法:
A. makeObject
- 触发条件:
- 当池中没有空闲对象,且当前活跃对象数小于
maxTotal
时,会调用此方法创建新对象。
- 当池中没有空闲对象,且当前活跃对象数小于
- 作用:
- 创建并包装一个新的
GrpcChannel
对象。
- 创建并包装一个新的
- 示例:
@Override public PooledObject<ManagedChannel> makeObject() {ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();return new DefaultPooledObject<>(channel); }
B. validateObject
- 触发条件:
- 当
testOnBorrow
设置为true
时,每次调用borrowObject
都会触发此方法。
- 当
- 作用:
- 验证对象是否处于健康状态,例如
GrpcChannel
是否已关闭或异常。 - 如果验证失败,该对象会被销毁。
- 验证对象是否处于健康状态,例如
- 示例:
@Override public boolean validateObject(PooledObject<ManagedChannel> p) {ManagedChannel channel = p.getObject();return !channel.isShutdown() && !channel.isTerminated(); }
C. activateObject
- 触发条件:
- 在对象被借出时会调用此方法(如果需要)。
- 作用:
- 激活对象,例如初始化某些状态或设置上下文信息。
- 示例:
@Override public void activateObject(PooledObject<ManagedChannel> p) {System.out.println("Activating gRPC Channel: " + p.getObject()); }
D. passivateObject
- 作用:
- 当对象被归还到池中时,
passivateObject
方法会被触发,用于将对象的状态重置为初始状态。
- 当对象被归还到池中时,
8. 调用流程总结
- 检查空闲对象是否可用:如果池中有空闲对象,尝试直接获取。
- 验证对象有效性:通过
validateObject
检查对象状态(取决于配置)。 - 激活对象:调用
activateObject
进行状态初始化(如果需要)。 - 创建新对象:如果没有可用对象且未达
maxTotal
,调用makeObject
创建新对象。
通过合理配置参数和优化对象工厂逻辑,可以有效提高 borrowObject
的性能和可靠性。
GrpcChannelPool 方法耗时分析及优化
1. 可能耗时的方法
A. makeObject
(创建对象)
-
耗时原因:
- 创建
GrpcChannel
涉及:- DNS 解析:在创建连接时需要解析目标服务器地址。
- 网络连接:与服务器建立 HTTP/2 连接。
- SSL/TLS 握手(如果启用加密):握手过程会增加额外的网络延迟。
- 认证过程(可选):如果使用身份验证机制(如 JWT、OAuth),会增加初始化时间。
- 通常,这个步骤是最耗时的,特别是当目标服务延迟较高或网络不稳定时。
- 创建
-
优化建议:
- 启用预热机制:
- 设置
minIdle
和timeBetweenEvictionRunsMillis
,在负载高峰前预先创建连接。
- 设置
- 优化网络环境:
- 使用快速 DNS 服务和低延迟网络。
- 连接复用:
- 尽量通过池化减少新连接的创建频率。
- 启用预热机制:
B. validateObject
(验证对象)
-
耗时原因:
- 验证逻辑可能会检查连接是否存活,通常包括:
- 检查连接是否已关闭或终止(通常较快)。
- 测试连接是否有效(如发送心跳或小数据包),如果涉及网络交互则可能增加延迟。
- 外部资源状态检查(例如,验证服务器响应状态)。
- 如果验证逻辑涉及网络请求(如 Ping 服务器),会导致验证时间延长。
- 验证逻辑可能会检查连接是否存活,通常包括:
-
优化建议:
- 本地快速验证:
- 首选本地状态检查(如
!channel.isShutdown()
),尽量避免网络交互。
- 首选本地状态检查(如
- 设置合理的验证频率:
- 仅在必要时启用
testOnBorrow
或testWhileIdle
。
- 仅在必要时启用
- 本地快速验证:
C. activateObject
(激活对象)
-
耗时原因:
- 激活逻辑通常较快,但如果涉及复杂的状态初始化或外部资源调用,可能会增加耗时。
- 示例耗时操作:
- 加载上下文信息。
- 注册监控事件。
- 清理历史状态。
-
优化建议:
- 简化激活逻辑,尽量避免耗时操作。
- 将部分激活工作移至
makeObject
,减少借用时的开销。
2. 哪些方法通常较快
A. passivateObject
(钝化对象)
- 用于在对象归还时重置状态,通常仅涉及本地操作,例如清除缓存或重置标志位,通常耗时极低。
B. destroyObject
(销毁对象)
- 销毁对象时通常调用
ManagedChannel.shutdown()
,异步关闭连接,对借用方的延迟影响较小。
3. 可能耗时的场景与应对策略
场景 | 耗时操作 | 应对策略 |
---|---|---|
创建新连接 | DNS 解析、网络连接、SSL 握手、身份验证 | 启用预热机制,提前创建连接,减少高峰期负载压力 |
验证连接有效性 | 网络交互(如心跳)、服务器状态检查 | 优化验证逻辑,仅在必要时进行全面检查 |
激活对象(初始化) | 初始化上下文、注册事件、状态清理 | 尽量简化激活逻辑,避免复杂耗时操作 |
网络不稳定或服务延迟问题 | 依赖外部服务的操作会增加时间 | 增强网络稳定性,确保服务响应快速可靠 |
4. 性能优化总结
-
减少创建连接频率:
- 通过连接池复用
GrpcChannel
,减少makeObject
的调用次数。
- 通过连接池复用
-
优化验证逻辑:
- 在
validateObject
中优先使用本地检查,避免不必要的网络交互。
- 在
-
提前创建和预热连接:
- 设置
minIdle
和timeBetweenEvictionRunsMillis
,在负载高峰前确保足够的空闲连接。
- 设置
-
监控与调试:
- 记录各方法的执行时间,识别性能瓶颈并优化耗时操作。
通过以上优化,可以显著降低 borrowObject
方法的延迟,提高 GrpcChannelPool
的性能和可靠性。
makeObject(创建对象)耗时分析及优化
1. 影响 makeObject
耗时的主要因素
A. DNS 解析时间
- 在创建
GrpcChannel
时,如果目标地址需要解析 DNS,耗时取决于 DNS 服务的响应时间。 - 一般耗时:
- 通常在 10-50ms。
- 如果缓存了 DNS 解析结果,可以进一步减少时间。
B. 网络连接时间
- 创建
GrpcChannel
需要与服务器建立 TCP 连接,这个过程受以下因素影响:- 服务器响应速度。
- 网络延迟(RTT,往返时间)。
- 一般耗时:
- 本地网络环境(LAN):通常在 5-30ms。
- 跨区域(WAN):可能达到 50-150ms,视网络质量而定。
C. SSL/TLS 握手时间
- 如果
GrpcChannel
使用了加密连接(useTransportSecurity
),握手会增加额外的耗时,包括:- 公私钥交换。
- 加密算法协商。
- 服务端证书验证。
- 一般耗时:
- 通常在 50-200ms,具体取决于服务器和客户端的计算能力以及网络环境。
D. 自定义逻辑
- 如果
makeObject
中包含其他初始化逻辑,例如身份认证、加载配置或依赖外部资源,可能进一步增加时间。 - 一般耗时:不固定,完全取决于实现。
2. 实际测量方法
为了测量 makeObject
的平均耗时,可以在代码中记录开始和结束时间,例如:
代码示例
import java.time.Duration;
import java.time.Instant;
import org.apache.commons.pool2.impl.DefaultPooledObject;public class GrpcChannelFactory implements PooledObjectFactory<ManagedChannel> {private final String target;public GrpcChannelFactory(String target) {this.target = target;}@Overridepublic PooledObject<ManagedChannel> makeObject() {Instant start = Instant.now(); // 开始计时ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext() // 或者使用 .useTransportSecurity().build();Instant end = Instant.now(); // 结束计时System.out.println("makeObject 耗时: " + Duration.between(start, end).toMillis() + " ms");return new DefaultPooledObject<>(channel);}// 其他方法省略...
}
3. 平均耗时的估算
在不同场景下,makeObject
的平均耗时可能如下:
场景 | 环境 | 平均耗时 | 主要原因 |
---|---|---|---|
本地开发(无加密) | 本地服务器/LAN | 5-20ms | TCP 连接快速,且无额外开销。 |
生产环境(加密连接) | 云服务器/WAN | 50-150ms | SSL 握手和网络延迟导致耗时增加。 |
复杂认证或初始化逻辑 | 使用外部身份认证服务 | 200ms 或更高 | 认证请求和外部依赖增加了耗时。 |
4. 如何优化 makeObject
的耗时
A. 减少 DNS 解析时间
- 方法:
- 在客户端启用 DNS 缓存(Java 默认启用,缓存时间可配置)。
- 使用 IP 地址直连,跳过 DNS 解析。
B. 提高网络连接速度
- 方法:
- 部署 gRPC 服务器和客户端在同一网络区域,降低网络延迟。
- 使用快速网络,如低延迟的专用通道或优化路由。
C. 减少 SSL 握手时间
- 方法:
- 使用更高效的加密算法(如 TLS 1.3)。
- 启用会话复用(Session Resumption),避免每次都重新握手。
D. 简化初始化逻辑
- 方法:
- 尽量减少
makeObject
中的额外逻辑,将复杂任务移到其他阶段。 - 在对象池中预热连接,减少实际使用时的初始化开销。
- 尽量减少
5. 总结
- 本地开发环境:平均耗时 5-20ms。
- 生产环境(加密连接、跨区域):平均耗时 50-150ms,高延迟网络可能更高。
- 复杂认证场景:如果涉及外部依赖,可能超过 200ms。
通过优化网络环境、减少初始化逻辑和启用预热机制,可以有效降低 makeObject
的平均耗时,从而提高系统性能。
makeObject(创建对象)与等待线程数的耗时比较
1. 两者耗时的核心区别
A. makeObject
(创建对象)耗时
makeObject
的耗时是主动操作的结果,受以下因素影响:
- 创建过程中的外部依赖:
- DNS 解析、网络连接、SSL/TLS 握手、外部服务验证等。
- 这些操作通常是固定的,对于每个新对象的创建,耗时是线性增加的。
- 无法完全避免:
- 如果连接池中没有足够的空闲对象,且活跃对象数已接近
maxTotal
,makeObject
是必需的耗时操作。
- 如果连接池中没有足够的空闲对象,且活跃对象数已接近
典型耗时范围:
- 无加密/本地连接:5-30ms。
- 加密连接/复杂验证:50-200ms,甚至更高。
B. 等待执行的线程数
等待线程数的耗时是被动等待的结果,受以下因素影响:
- 线程排队机制:
- 当
borrowObject
被调用时,如果没有空闲对象且活跃对象数已达maxTotal
,新的线程会进入等待状态。
- 当
- 最大等待时间限制:
- 配置了
maxWaitMillis
时,线程会阻塞至超时或有对象归还/创建完成。
- 配置了
- 竞争关系:
- 如果线程数较多,等待时间可能呈指数级增长,因为所有线程需要依次获取锁或等待资源。
典型耗时范围:
- 低竞争场景:几十毫秒到几百毫秒,取决于资源释放速度。
- 高竞争场景:可能超时(抛出
NoSuchElementException
或TimeoutException
),视配置而定。
2. 哪种操作更耗时?
场景 1:连接池有足够的资源
makeObject
更耗时:- 如果连接池中有空闲对象,即使有线程排队,借用操作会立即完成,线程等待耗时较短。
- 新对象的创建仍需要进行网络连接等耗时操作,因此
makeObject
更耗时。
场景 2:连接池资源耗尽
- 等待线程数更耗时:
- 当所有对象都被借出,且线程需要等待时,线程排队时间可能无限增长(取决于资源归还速度)。
- 特别是高并发场景中,线程数较多时,每个线程的等待时间会显著增加。
场景 3:高并发 + 对象创建较慢
- 两者均耗时:
- 在高并发场景中,如果
makeObject
创建对象较慢,线程等待时间会与makeObject
的耗时叠加。 - 如果等待线程数远多于可用资源,线程的等待时间可能最终成为主要瓶颈。
- 在高并发场景中,如果
3. 优化策略
A. 优化 makeObject
的耗时
- 启用预热机制:
- 配置
minIdle
和timeBetweenEvictionRunsMillis
,确保在高并发到来前提前创建连接。
- 配置
- 简化创建逻辑:
- 优化 DNS 解析、网络连接和认证流程,减少创建对象的固定开销。
- 分布式连接池:
- 在高并发场景下,使用多个连接池分散负载,降低单个池的压力。
B. 优化等待线程数
- 增加连接池容量:
- 调整
maxTotal
和maxIdle
,确保池中有足够的资源处理高峰流量。
- 调整
- 动态调配资源:
- 根据请求量动态调整池的大小,避免长时间的线程排队。
- 合理设置超时:
- 配置
maxWaitMillis
,限制线程的最大等待时间,避免因过长的阻塞导致系统雪崩。
- 配置
4. 综合判断:耗时比较
条件 | 耗时较高的操作 | 原因 |
---|---|---|
空闲连接充足 | makeObject | 需要进行创建过程,涉及网络连接、加密握手等。 |
资源完全耗尽 | 等待线程数 | 线程阻塞时间可能超过资源创建时间,取决于资源归还速度和线程数。 |
高并发 + 低资源归还速率 | 两者均耗时 | 新对象创建缓慢导致线程长时间排队,线程排队又进一步增加系统压力。 |
5. 示例优化配置
以下是一个优化配置的示例,平衡 makeObject
和等待线程数的耗时问题:
GenericObjectPoolConfig<ManagedChannel> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(50); // 增加池的容量,减少线程等待
config.setMinIdle(10); // 启用预热机制,提前创建连接
config.setTimeBetweenEvictionRunsMillis(10000); // 每 10 秒检测空闲连接
config.setMaxWaitMillis(500); // 限制线程的最大等待时间
config.setTestOnBorrow(true); // 借用时验证连接是否有效
6. 结论
- 小规模并发(空闲资源充足):
makeObject
通常更耗时。 - 高并发 + 资源耗尽:线程等待时间更耗时。
- 综合优化:通过预热机制、动态资源调配和合理配置参数,可以有效降低两者的耗时,提升系统性能。
相关文章:
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多…...
【数据结构与算法:八、排序】
第8章 排序 排序是计算机科学中最基本且最常用的操作之一。本章详细介绍了排序算法的概念、分类、每种算法的定义、图示、代码实现及其应用场景。 8.1 基本概念和排序方法概述 8.1.1 排序的基本概念 排序是指将一组无序的记录按照某种指定的顺序重新排列的过程。 排序的目…...
Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 整体状态框架(简化) Player 是操作对象的类: 继承了 MonoBehaviour 用于定义游戏对象的行为,每个挂载在 Unity 游戏对象上的脚本都需要继承自 MonoBehaviour&#x…...
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
参考文章: 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客 一、简单介绍 本文开发环境,均为 windows 环境,mac 环境其实也类似 ~ ① 编译proto文件,相关插件 简单介绍: protoc 是编译器,用于将…...
策略模式(strategy)
一.策略模式是什么 策略模式是一种行为型对象模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。这样,算法可以独立于使用它的客户端而变化。 策略者模式的核心思想是将一系列的算法封装到一系列的策略类里…...
Centos源码安装MariaDB 基于GTID主从部署(一遍过)
MariaDB安装 安装依赖 yum install cmake ncurses ncurses-devel bison 下载源码 // 下载源码 wget https://downloads.mariadb.org/interstitial/mariadb-10.6.20/source/mariadb-10.6.20.tar.gz // 解压源码 tar xzvf mariadb-10.5.9.tar.gz 编译安装 cmake -DCMAKE_INSTA…...
如何在 VSCode 中配置 C++ 开发环境:详细教程
如何在 VSCode 中配置 C 开发环境:详细教程 在软件开发的过程中,选择一个合适的开发环境是非常重要的。Visual Studio Code(VSCode)作为一款轻量级的代码编辑器,凭借其强大的扩展性和灵活性,受到许多开发者…...
信息安全、网络安全和数据安全的区别和联系
1. 前言 有次有朋友问我 信息安全、网络安全和数据安全,这三个词平时写文档时怎么用? 我想很多人都说不清。这次我查阅了资料,尽量讲清楚这三者之间的区别和联系。 2. 信息安全 2.1 定义 信息安全是指为数据处理系统建立和采用的技术和管…...
路由组件与一般组件的区别
路由组件与一般组件的区别 1. 基本概念 1.1 路由组件 路由组件是指通过路由规则映射的组件,通常放在 pages 或 views 文件夹中。 1.2 一般组件 一般组件是指通过 import 导入后直接使用的组件,通常放在 components 文件夹中。 2. 主要区别 2.1 存…...
【微服务】4、服务保护
微服务架构与组件介绍 单体架构拆分:黑马商城早期为单体架构,后拆分为微服务架构。跨服务调用与组件使用 服务拆分后存在跨服务远程调用,如下单需查询商品信息,使用openfeign组件解决。服务间调用关系复杂,需维护服务…...
6_TypeScript 函数 --[深入浅出 TypeScript 测试]
在 TypeScript 中,函数是编程的核心组成部分之一。TypeScript 不仅继承了 JavaScript 的所有函数特性,还添加了静态类型检查和其他一些增强功能,使得函数更加安全和易于理解。以下是关于 TypeScript 函数的一些关键点和两个具体的示例&#x…...
Apifox=Postman+Swagger+Jmeter+Mock
A. 开发人员接口管理使用(Swagger 工具管理接口) B. 后端开发人员通过Postman 工具,一边开发一边测试 C. 前端开发人员需要Mock 工具提供前端调用 D. 测试人员通过(Postman、Jmeter)等工具进行接口测试 为了后台开发、前端开发、测试工程师等不同角色更加便捷管理…...
升级 Spring Boot 3 配置讲解 —— Spring Boot 3 核心源码专讲
学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! Spring Boot 3 是 Spring 生态中的重要里程碑,它不仅全面支持 Java 17,还引入了许多新特性,如对 GraalVM 原生镜像的支持、改进的性能优化以及更灵活的…...
接口开发完后,个人对于接下来接口优化的一些思考
优化点 入参的合法性和长度范围,必填项的检查验证 因为没有入参,所以不需要考虑。 批量思想解决N1问题 // 假设要查询100个订单及其对应的用户信息 List<Order> orders orderMapper.selectList(new QueryWrapper<>().last("limit …...
jenkins 使用 ssh-agent向windows进行部署
背景: jenkins在linux的docker环境内,应用服务部署在windows。需要使用jenkins实现自动化部署。 实现方式: jenkins上构建pipeline任务,脚本如下: 遇到问题: 1、问题:jenkins 调用部署bat脚…...
音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现
一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 (…...
如果Adobe 退出中国后怎么办
最近听说Adobe要退出中国了?那咱们的设计师们可得好好想想怎么搞到正版软件了。别急,今天教大家一个超酷的福利——Edu邮箱! Edu邮箱是什么?有什么好处? Edu邮箱就是学校给学生和老师们发的邮箱,一般结尾是.edu。有了…...
欧几里得距离在权重矩阵中的物理意义
欧几里得距离在权重矩阵中的物理意义 目录 欧几里得距离在权重矩阵中的物理意义**衡量神经元差异程度**:**反映模型变化程度**:**聚类和分组的依据**:自然语言处理中的模型更新:**神经网络聚类分组**:欧几里得距离在权重矩阵中的物理意义衡量神经元差异程度: 在神经网络中…...
玩转大语言模型——ollama导入huggingface下载的模型
ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便,但是也存在一定的问题,比如不能使用自己…...
Linux-----进程通讯(管道Pipe)
目录 进程不共享内存 匿名管道 通过匿名管道实现通讯 有名管道 库函数mkfifo() 案例 进程不共享内存 不同进程之间内存是不共享的。是相互独立的。 #include <stdio.h> #include <stdlib.h> #include <errno.h>int num 0;int main(int argc, char con…...
【C++11】列表初始化、右值引用和移动语义、引用折叠、完美转发
C11 一.C的发展历史二.列表初始化1.C98的{}2.C11的{}3.C11中的std::initializer_list 三.右值引用和移动语义1.左值和右值2.左值引用和右值引用3.引用延长生命周期4.左值和右值的参数匹配5.右值引用和移动语义使用场景1.左值引用使用场景2.移动构造和移动赋值3.右值引用和移动语…...
Openssl1.1.1s rpm包构建与升级
rpmbuild入门知识 openssh/ssl二进制升级 文章目录 前言一、资源准备1.下载openssh、openssl二进制包2.安装rpmbuild工具3.拷贝源码包到SOURCES目录下4.系统开启telnet,防止意外导致shh无法连接5.编译工具安装6.补充说明 二、制作 OpenSSL RPM 包1.编写 SPEC 文件2.…...
递归思想的深度理解——汉诺塔问题和青蛙跳台阶问题
递归的深度理解——汉诺塔问题and青蛙跳台阶问题 青蛙跳台阶问题汉诺塔问题 青蛙跳台阶问题 问题:一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳n级台阶,共有多少种跳法? 解答:我们可以先…...
从数据到诊断:朴素贝叶斯算法助力肿瘤预测之路
1.案例概述 肿瘤性质的判断影响着患者的治疗方式和痊愈速度。传统的做法是医生根据数十个指标来判断肿瘤的性质,预测效果依赖于医生的个人经验而且效率较低,而通过机器学习有望能快速预测肿瘤的性质。 2.数据集 本次肿瘤预测使用的数据集共有569组样本…...
Element-UI:如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中?
如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中? 在使用 Element UI 的 Table 组件时,如果你想要禁用某一行的选中(特别是在多选模式下),可以通过自定义行的 selectable 属性来实现。selectable …...
Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py
此脚本的主要功能是可视化点云数据文件(.pcd 文件),并通过键盘交互选择演示数据的起始帧和结束帧,生成片段标记文件 (clip_marks.json) 主要流程包括: 用户指定数据目录:检查目录是否存在并处理标记文件 -…...
JWT理解
前言 随着互联网的快速发展,身份验证和授权成为了许多应用的重要需求。JWT(JSON Web Token)作为一种轻量级的身份验证和授权机制,得到了广泛的应用。本文将为您详细介绍JWT的原理、结构和优点,帮助您更好地理解和应用…...
一种融合联邦学习和大模型特点的全新系统架构
一种融合联邦学习和大模型特点的全新系统架构 以下是一种融合联邦学习和大模型特点的全新系统架构设计: 分层分布式架构 底层 - 数据采集与预处理层:由大量的边缘设备和终端节点组成,如智能手机、物联网传感器等。这些设备负责采集本地数据,并在本地进行初步的数据预处理,…...
html表格table导出excel,主从表格式,带样式.自动分列
html的table导出成excel, vue模板 项目使用xlsx-js-style 源代码从https://github.com/gitbrent/xlsx-js-style/releases/tag/v1.2.0 下载 用里面的dist目录下的文件即可. 复制到vue项目的public目录下的XLSX目录下. 在index.hml中引入js脚本, 为啥要在这里引入? 是因为这里…...
U8G2库使用案例(stm32)
目录 一、小球在 OLED 屏幕平面内运动并碰撞反弹的效果 二、 简单的波形生成和显示程序: 三、三维三角形旋转展示 四、正方形平面内顺时针旋转 五、带有旋转点的空心圆圈应用 六、字幕滚动效果 七、下雪动画效果 八、进度条动画效果 自己移植的U8g2库,OLED库…...
067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】
课程培训包含:发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习,学员可以掌握Biomod2模型最新版本的使用方法,最新版包含12个模型(ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…...
【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
AI的两次寒冬:从感知机困局到深度学习前夜 引用(中英双语) 中文: “第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。” “第二次AI寒冬,则是因为专家系统的局限性和硬…...
141.《mac m系列芯片安装mongodb详细教程》
文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…...
【Linux】sed编辑器
一、基本介绍 sed编辑器也叫流编辑器(stream editor),它是根据事先设计好得一组规则编辑数据流。 交互式文本编辑器(如Vim)中,可以用键盘命令交互式地插入、删除或替换文本数据。 sed编辑器是根据命令处理…...
unity3d-搞个场景漫游如何实现Alpha
要处理两个问题: 如何设置地面人不掉下去 方法一、 游戏物体加刚体,将游戏物体和地面加collider。如果是地形,可以使用 Terrain Collider;如果是简单的平面,可以添加 Box Collider 或者 Mesh Collider(如果…...
概率基本概念 --- 离散型随机变量实例
条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y,它们代…...
oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln
目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考,oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场,主要考察 nmap的使用已经是否会看输出,以及是否会通过应用查找对应漏…...
【简博士统计学习方法】3. 统计学习方法的三要素
3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…...
UnionTech OS Server 20 网页无法访问yum源地址
统信yum地址 https://euler-packages.chinauos.com/server-euler/fuyu/1060/everything/sw_64/Packages/ 浏览器访问401报错无权限,查看linux uos环境下yum配置的用户名和密码 cat /etc/yum/vars/auth_* 然后自己组装生成Basic Authorization def generate_basic_…...
WPF区域导航+导航参数使用+路由守卫+导航日志
背景:使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的,不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel: private object body;public object Body {get { retu…...
jvm基础
jvm的基本结构 类加载器(ClassLoader):加载class文件到内存中进行使用。 运行时数据区(Runtime Data Area):这是JVM在运行Java程序期间管理的内存区域,包括方法区(Meta…...
kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration
1.引言 作为一名(坦白说有点懒的)图像处理方向的研究生,说实话最近新开一个坑,可能是因为要寒假了比较无聊,这次带来的系列是kaggle数据处理竞赛的经典例题:纽约出租车行程时间问题。希望大家多多支持&…...
Python提取目标Json键值:包含子嵌套列表和字典
目标:取json中所有的Name、Age字典 思路:递归处理字典中直接包含子字典的情况, import jsondef find_targ_dicts(data,key1,key2):result {}if isinstance(data, dict):if key1 in data and key2 in data: # 第一层字典中包含key1和key2re…...
<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么
$t是Vue I18n插件提供的一种方法,用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例,展示如何在Vue I18n中定义消息: const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...
医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建
FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包,广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发,旨在为神经科学研究人员提供一个高效、精确的数据…...
win32汇编环境,在对话框中画五边形与六边形
;运行效果 ;win32汇编环境,在对话框中画五边形与六边形 ;展示五边形与六边形的画法 ;将代码复制进radasm软件里,直接编译可运行.重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>&g…...
小白学Pytorch
小白学Pytorch 发现一个比较好的教程,对于自己来说比较合适,适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚: 我们使用nn包中的Sequential搭建网络&#…...
[A-25]ARMv8/v9-GIC的系统架构(中断的硬件基础)
ver0.1 前言 我们在观看很多的影视剧过程中,尤其是军旅体裁类型的布景中,经常会看见高级干部的办公桌上都会有几部电话机。这样的电话可不能小看,重要的事情尤其是突发和紧急的情况都要通过这几部电话第一时间通知给决策者。这几部电话,必须举报几个特点:及时性好、稳定…...
毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
学习threejs,导入AWD格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.AWDLoader AWD模型加…...