Apache Commons Pool :介绍与使用
Apache Commons Pool :介绍与使用
什么是 commons-pool2
?
commons-pool2
是 Apache Commons 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持,方便开发者管理资源(如数据库连接、网络连接等)复用,从而减少资源创建与销毁的开销,提高应用程序的性能和可扩展性。
功能特性
- 对象池管理:
- 提供对象的创建、复用、回收、销毁机制。
- 多种池实现:
- 支持通用对象池(
GenericObjectPool
)和键值对象池(GenericKeyedObjectPool
)。
- 支持通用对象池(
- 强大的配置支持:
- 可以自定义池大小、最大闲置数、最小闲置数等。
- 线程安全:
- 内部实现了高效的并发控制。
- 动态调节:
- 支持在运行时动态调整池的大小和行为。
如何使用
Maven 依赖
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version>
</dependency>
使用步骤
- 创建对象工厂:
- 实现
org.apache.commons.pool2.PooledObjectFactory
接口,用于定义对象的创建和销毁逻辑。
- 实现
- 初始化对象池:
- 使用
GenericObjectPool
或GenericKeyedObjectPool
来管理对象池。
- 使用
- 获取与归还对象:
- 使用
borrowObject()
从池中获取对象,用完后通过returnObject()
将对象归还到池中。
- 使用
示例:使用 GenericObjectPool
以下是一个简单的数据库连接池实现。
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;// 模拟的数据库连接类
class DatabaseConnection {private String id;public DatabaseConnection(String id) {this.id = id;}public void connect() {System.out.println("Connecting to database with ID: " + id);}public void close() {System.out.println("Closing database connection with ID: " + id);}public String getId() {return id;}
}// 数据库连接工厂类
class DatabaseConnectionFactory implements PooledObjectFactory<DatabaseConnection> {private int counter = 0;@Overridepublic PooledObject<DatabaseConnection> makeObject() {DatabaseConnection connection = new DatabaseConnection("DB-" + (++counter));System.out.println("Creating new connection: " + connection.getId());return new DefaultPooledObject<>(connection);}@Overridepublic void destroyObject(PooledObject<DatabaseConnection> p) {p.getObject().close();}@Overridepublic boolean validateObject(PooledObject<DatabaseConnection> p) {return true; // 假设所有对象都有效}@Overridepublic void activateObject(PooledObject<DatabaseConnection> p) {p.getObject().connect();}@Overridepublic void passivateObject(PooledObject<DatabaseConnection> p) {// 暂时不需要实现}
}public class ConnectionPoolExample {public static void main(String[] args) throws Exception {// 配置对象池GenericObjectPoolConfig<DatabaseConnection> config = new GenericObjectPoolConfig<>();config.setMaxTotal(5); // 最大对象数config.setMaxIdle(3); // 最大闲置数config.setMinIdle(1); // 最小闲置数config.setTestOnBorrow(true); // 借出时测试对象是否有效// 创建对象池GenericObjectPool<DatabaseConnection> pool = new GenericObjectPool<>(new DatabaseConnectionFactory(), config);// 使用对象池DatabaseConnection conn1 = pool.borrowObject(); // 从池中获取对象conn1.connect();DatabaseConnection conn2 = pool.borrowObject();conn2.connect();pool.returnObject(conn1); // 将对象归还到池中pool.returnObject(conn2);// 销毁池pool.close();}
}
输出示例
Creating new connection: DB-1
Connecting to database with ID: DB-1
Connecting to database with ID: DB-2
Closing database connection with ID: DB-1
Closing database connection with ID: DB-2
优化方式
-
合理配置池参数:
maxTotal
:限制最大对象数,防止过多对象占用内存。minIdle
:设置最小闲置数,避免频繁创建与销毁对象。maxWaitMillis
:设置获取对象的超时时间。
-
定期测试池对象:
setTestOnBorrow(true)
:借出时验证对象。setTestOnReturn(true)
:归还时验证对象。setTestWhileIdle(true)
:闲置时验证对象。
-
监控池性能:
- 利用池的
getNumActive()
和getNumIdle()
方法动态监控池中活动与闲置的对象数。
- 利用池的
-
资源回收:
- 确保池在不需要时调用
close()
释放资源。
- 确保池在不需要时调用
常见场景
- 数据库连接池
- 网络连接池
- 线程池管理
- 文件句柄池
commons-pool2 闲置对象过期及设置详解
默认行为
commons-pool2
的连接池实现中,闲置对象的过期时间以及移除行为由多个参数共同决定。
默认配置
- 默认情况下,如果没有显式设置移除闲置对象的策略,连接池中的对象可能因为资源限制而被移除。
- 具体的移除时机依赖于如下参数设置。
相关参数详解
1. minIdle
- 描述: 最小闲置连接数。
- 作用: 保证连接池中始终有一定数量的对象处于闲置状态。
- 默认值:
0
(即没有保留最小闲置对象)。 - 影响: 如果设置为较大的值,连接池会在对象被移除前尝试补充更多的空闲对象。
2. timeBetweenEvictionRunsMillis
- 描述: 间隔多久运行一次空闲对象的逐出检查线程(以毫秒为单位)。
- 默认值:
-1
(表示不运行逐出线程)。 - 建议优化: 设置为合理的时间间隔,例如
30000
毫秒(30 秒)。
3. minEvictableIdleTimeMillis
- 描述: 对象在池中保持空闲状态的最小时间(以毫秒为单位),超过该时间的对象可能会被移除。
- 默认值:
1800000
毫秒(30 分钟)。 - 建议优化: 设置为较小的值以快速移除闲置对象,例如
600000
毫秒(10 分钟)。
4. softMinEvictableIdleTimeMillis
- 描述: 对象在池中保持空闲状态的最小时间(以毫秒为单位),但只有当空闲对象超过
minIdle
时才会被移除。 - 默认值: 未设置。
- 建议优化: 配合
minIdle
使用,用于延长部分闲置对象的存活时间。
5. numTestsPerEvictionRun
- 描述: 每次空闲对象检查时检测的对象数量。
- 默认值:
-1
(检查所有对象)。 - 建议优化: 根据池的大小设置为一个合理的值,例如
10
。
配置示例
以下是一个完整的连接池配置示例:
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class PoolConfigExample {public static void main(String[] args) {GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();// 设置最小空闲对象数config.setMinIdle(5);// 设置最大空闲对象数config.setMaxIdle(20);// 设置最大池容量config.setMaxTotal(50);// 设置空闲对象逐出线程运行间隔(30 秒)config.setTimeBetweenEvictionRunsMillis(30000);// 设置空闲对象的最小逐出时间(10 分钟)config.setMinEvictableIdleTimeMillis(600000);// 检查空闲对象的线程一次处理的数量config.setNumTestsPerEvictionRun(5);// 创建连接池GenericObjectPool<Object> pool = new GenericObjectPool<>(new MyObjectFactory(), config);System.out.println("连接池初始化完成!");}
}// 示例对象工厂
class MyObjectFactory extends BasePooledObjectFactory<Object> {@Overridepublic Object create() throws Exception {return new Object(); // 返回一个新对象}@Overridepublic PooledObject<Object> wrap(Object obj) {return new DefaultPooledObject<>(obj);}
}
总结
空闲对象的移除策略
- 默认情况下,闲置对象不会自动过期,除非设置了逐出线程参数(如
timeBetweenEvictionRunsMillis
)。 - 设置
minEvictableIdleTimeMillis
可以明确指定闲置对象的过期时间。 - 通过调优
minIdle
和maxIdle
可以更好地控制池中对象的生命周期。
推荐配置
- 动态调整参数: 根据实际负载和资源需求动态调整
minIdle
和timeBetweenEvictionRunsMillis
。 - 观察性能: 通过性能测试和监控,逐步优化连接池的行为,减少过期对象对系统性能的影响。
Apache Commons Pool: 最小闲置数与逐出线程的交互行为
背景介绍
Apache Commons Pool
是一个高效的对象池管理库,广泛用于连接池、线程池等需要管理资源的场景。其配置包括 最小闲置数 (minIdle) 和 逐出线程 (Evictor) 参数。
-
最小闲置数 (
minIdle
):- 定义对象池中需要保持的最小空闲对象数。
- 如果空闲对象少于该值,池会创建新的对象,直到满足
minIdle
。
-
逐出线程 (
Evictor
):- 周期性检查并清理空闲对象。
- 受
timeBetweenEvictionRunsMillis
和minEvictableIdleTimeMillis
参数控制。
参数交互行为
当 minIdle
和逐出线程参数同时设置时,逐出线程会考虑 minIdle
,确保空闲对象数不低于该值。
逐出线程行为规则
-
逐出线程运行规则:
- 定期检查空闲对象是否超过
minEvictableIdleTimeMillis
。 - 清理超过空闲时间的对象。
- 定期检查空闲对象是否超过
-
空闲对象保留规则:
- 如果当前空闲对象数少于或等于
minIdle
,逐出线程不会清理这些对象。 - 若空闲对象数大于
minIdle
,逐出线程会清理部分对象,直到空闲对象数等于minIdle
或更少。
- 如果当前空闲对象数少于或等于
参数对行为的影响
参数 | 描述 |
---|---|
minIdle | 池中最小保留空闲对象数。 |
timeBetweenEvictionRunsMillis | 逐出线程运行的时间间隔(毫秒)。 |
minEvictableIdleTimeMillis | 对象可被清理的最小空闲时间(毫秒)。 |
示例代码
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class PoolConfigExample {public static void main(String[] args) {GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();// 设置最小空闲数config.setMinIdle(5);// 逐出线程每30秒运行一次config.setTimeBetweenEvictionRunsMillis(30000);// 空闲时间超过60秒的对象可能被清理config.setMinEvictableIdleTimeMillis(60000);// 示例:确保至少保留5个空闲对象System.out.println("Pool configured with minIdle=5");}
}
特殊场景
-
最小闲置数未设置或为0:
- 空闲对象数可能会被清理为 0。
- 下次获取对象时需要重新创建,可能导致性能下降。
-
逐出线程未设置:
- 空闲对象永远不会被清理,可能造成内存占用。
重要结论
- 逐出线程不会清理到低于
minIdle
的空闲对象数。 - 如果设置合理的
minEvictableIdleTimeMillis
和timeBetweenEvictionRunsMillis
,可以在资源回收与性能间取得平衡。 - 配置建议:
- 保证
minIdle
的值与系统负载需求匹配。 - 根据对象的生命周期合理配置
minEvictableIdleTimeMillis
。 - 避免过于频繁或过于稀疏的逐出线程运行时间。
- 保证
总结
Apache Commons Pool
提供了灵活的参数配置,支持多种资源池管理场景。当 minIdle
和逐出线程参数同时设置时,系统会优先保证 minIdle
的空闲对象数,不会因逐出线程清理而导致空闲对象不足。合理的参数配置可以在资源利用率与性能间找到最佳平衡点。
Apache Commons Pool - 逐出线程设置指南
背景
在使用 Apache Commons Pool
进行对象池管理时,如果未设置逐出线程,空闲对象将永远不会被清理,可能导致内存占用问题。因此,合理配置逐出线程的相关参数可以避免资源泄露,提高系统性能。
关键参数
timeBetweenEvictionRunsMillis
- 作用:控制逐出线程的运行周期(以毫秒为单位)。
- 默认值:
-1
,表示逐出线程不运行。 - 建议设置:例如
60000
表示每分钟运行一次。
minEvictableIdleTimeMillis
- 作用:设置空闲对象被逐出的最小生存时间(以毫秒为单位)。
- 默认值:
1800000
(30 分钟)。 - 建议设置:根据业务需求调整,例如 10 分钟:
600000
。
minIdle
- 作用:确保池中始终保持的最小空闲对象数。即使逐出线程运行,也不会清理低于该数量的空闲对象。
- 建议设置:根据系统负载调整,例如
5
。
maxIdle
- 作用:限制池中空闲对象的最大数量。如果空闲对象超过此值,多余的对象会被逐出。
- 建议设置:例如
10
。
配置代码示例
以下代码展示如何通过 GenericObjectPool
设置逐出线程:
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;public class PoolExample {public static void main(String[] args) {// 配置池参数GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();// 设置最小空闲连接数config.setMinIdle(5);// 设置最大空闲连接数config.setMaxIdle(10);// 设置最大连接数config.setMaxTotal(20);// 逐出线程运行周期(每 60 秒运行一次)config.setTimeBetweenEvictionRunsMillis(60000);// 最小可逐出时间(30 分钟未使用的空闲对象会被清理)config.setMinEvictableIdleTimeMillis(1800000);// 创建对象池GenericObjectPool<Object> pool = new GenericObjectPool<>(new ObjectFactory(), config);// 使用对象池try {Object obj = pool.borrowObject(); // 获取对象pool.returnObject(obj); // 归还对象} catch (Exception e) {e.printStackTrace();} finally {pool.close(); // 关闭池}}// 自定义对象工厂static class ObjectFactory extends BasePooledObjectFactory<Object> {@Overridepublic Object create() {return new Object(); // 创建对象}@Overridepublic PooledObject<Object> wrap(Object obj) {return new DefaultPooledObject<>(obj); // 包装对象}}
}
参数详细说明
参数名称 | 作用 | 示例值 |
---|---|---|
setTimeBetweenEvictionRunsMillis | 控制逐出线程的运行周期。正值表示启用逐出线程,例如 60000 表示每分钟运行一次。 | 60000 |
setMinEvictableIdleTimeMillis | 空闲对象的最小生存时间,超过此时间的对象会被逐出。 | 1800000 |
setMinIdle | 保证的最小空闲对象数,即使逐出线程运行,也不会清理低于该数量的对象。 | 5 |
setMaxIdle | 最大空闲对象数,超过此值的对象会被逐出。 | 10 |
配置文件示例
可以通过 properties
文件加载配置:
pool.minIdle=5
pool.maxIdle=10
pool.maxTotal=20
pool.timeBetweenEvictionRunsMillis=60000
pool.minEvictableIdleTimeMillis=1800000
在代码中加载配置:
Properties props = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {props.load(input);GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();config.setMinIdle(Integer.parseInt(props.getProperty("pool.minIdle")));config.setMaxIdle(Integer.parseInt(props.getProperty("pool.maxIdle")));config.setMaxTotal(Integer.parseInt(props.getProperty("pool.maxTotal")));config.setTimeBetweenEvictionRunsMillis(Long.parseLong(props.getProperty("pool.timeBetweenEvictionRunsMillis")));config.setMinEvictableIdleTimeMillis(Long.parseLong(props.getProperty("pool.minEvictableIdleTimeMillis")));
}
优化建议
- 合理设置最小和最大空闲对象数:避免频繁创建和销毁对象。
- 监控池性能:通过池提供的指标(例如活动对象数、空闲对象数)动态调整配置。
- 避免逐出线程频繁运行:将逐出线程运行周期设置为合理的值,例如 1 分钟或更长时间。
- 测试与调优:根据实际使用场景不断调整参数,平衡性能与资源消耗。
通过合理设置逐出线程和相关参数,可以显著提高对象池的性能和资源利用效率。
线程数量逐渐增加的原因分析与参数设置建议
当线程数量逐渐增加时,可能是由于以下原因或参数设置的问题导致的。以下是详细分析及解决方法。
1. 未限制线程池最大线程数量
-
原因:
- 未设置线程池的最大线程数 (
maxTotal
),默认值可能非常大甚至是无界的。随着任务增加,线程池不断创建新线程来满足请求,导致线程数量逐渐增加。
- 未设置线程池的最大线程数 (
-
解决方法:
- 设置合理的
maxTotal
值,以限制线程池中的最大线程数。
- 设置合理的
2. 核心线程数设置过高
-
原因:
corePoolSize
是线程池中核心线程的数量。如果设置过高,即使任务较少,线程池也会保持较多的核心线程。
-
解决方法:
- 根据实际需求,设置一个合理的
corePoolSize
值,以减少空闲线程的数量。
- 根据实际需求,设置一个合理的
3. 空闲线程未被回收
-
原因:
- 空闲线程的生存时间参数 (
minEvictableIdleTimeMillis
) 过长,导致空闲线程无法及时被逐出。
- 空闲线程的生存时间参数 (
-
解决方法:
- 设置
minEvictableIdleTimeMillis
为合理的时间(如 30 秒或 60 秒),使得空闲线程能在闲置一段时间后被回收。
- 设置
4. 逐出线程未启动
-
原因:
- 未启用逐出线程(Evictor),导致空闲线程不会被定期清理,线程池中的线程数量可能持续累积。
-
解决方法:
- 设置
timeBetweenEvictionRunsMillis
为一个正值(如 30000 毫秒),开启逐出线程。 - 配合使用
minEvictableIdleTimeMillis
和numTestsPerEvictionRun
参数进行逐出策略优化。
- 设置
5. 任务积压导致线程池扩容
-
原因:
- 线程池的队列(
workQueue
)容量不足时,新任务可能会触发线程池动态扩容。如果任务积压过多,线程池可能创建更多线程来处理任务。
- 线程池的队列(
-
解决方法:
- 使用有限大小的阻塞队列(如
LinkedBlockingQueue
),并合理设置其容量。 - 设置
maximumPoolSize
限制线程数量的扩展。
- 使用有限大小的阻塞队列(如
6. 线程工厂问题
-
原因:
- 如果线程池使用的
ThreadFactory
未正确管理线程,可能会导致线程池创建更多的线程。
- 如果线程池使用的
-
解决方法:
- 确保
ThreadFactory
正确实现,并为线程池创建的线程设置合理的优先级、命名和守护线程属性。
- 确保
7. 线程泄漏
-
原因:
- 某些任务未正常退出线程,或线程被错误地持久化,导致线程池中的线程无法被回收。
-
解决方法:
- 定期监控线程池中的活动线程数。
- 确保任务逻辑正确,避免线程长期处于阻塞状态。
参数设置示例
以下是一个合理的线程池参数设置,避免线程数量逐渐增加:
GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();
config.setMaxTotal(100); // 设置线程池最大线程数
config.setMinIdle(10); // 设置最小闲置线程数
config.setMaxIdle(50); // 设置最大闲置线程数
config.setTimeBetweenEvictionRunsMillis(30000); // 逐出线程运行间隔
config.setMinEvictableIdleTimeMillis(60000); // 最小闲置时间
config.setNumTestsPerEvictionRun(3); // 每次逐出线程检测的对象数
通过合理的参数设置,可以有效控制线程数量,避免不必要的资源消耗。
对象清理行为分析及配置
问题描述
当 最小闲置数未设置或为0 且 逐出线程未设置 的情况下,如何清理空闲对象?是优先清理最小闲置数为0的对象,还是优先考虑逐出线程未设置的情况,即使最小闲置数为0也不清理?
行为规则分析
1. 最小闲置数未设置或为0
- 效果:
- 如果
minIdle
设置为0
或未设置,则空闲池对象可以降到 0 个,即没有任何最小保留的连接或线程。 - 但仅此设置并不会直接导致清理,因为清理动作需要逐出线程的参与。
- 如果
2. 逐出线程未设置
- 效果:
- 如果没有设置逐出线程(即未配置
evictor
),则系统不会主动清理空闲对象。 - 即使
minIdle
是0
,由于缺少逐出线程触发,空闲对象仍然会长期存在。
- 如果没有设置逐出线程(即未配置
3. 优先顺序
- 逐出线程优先控制清理逻辑:如果没有逐出线程,即使
minIdle
为0
,也不会清理空闲对象。 - 清理动作需要逐出线程定期检查并触发。
总结行为
1. 逐出线程未设置的情况:
- 空闲对象永远不会被清理。
- 即使
minIdle
为0
,对象也会一直存在,导致资源可能被长期占用。
2. 逐出线程设置了,但 minIdle
为0的情况:
- 逐出线程会按照配置定期运行,清理空闲对象,直到池中对象数量为
0
。
优化建议
1. 如果希望空闲对象及时释放:
- 配置逐出线程参数:
timeBetweenEvictionRunsMillis
:逐出线程运行的时间间隔(单位:毫秒)。minEvictableIdleTimeMillis
:空闲对象被逐出的最短存活时间(单位:毫秒)。
- 设置
minIdle
为合适的非零值(如minIdle = 2
),确保资源池中保留一定数量的空闲对象。
2. 如果不希望清理空闲对象:
- 设置
minIdle
为大于 0 的值(如minIdle = 5
)。 - 不设置逐出线程参数,或将
timeBetweenEvictionRunsMillis
设置为一个较大的值,避免频繁触发清理。
示例代码
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;GenericObjectPoolConfig<?> config = new GenericObjectPoolConfig<>();// 设置最小闲置数为 0
config.setMinIdle(0);// 配置逐出线程,每 30 秒运行一次
config.setTimeBetweenEvictionRunsMillis(30000);// 空闲对象超过 60 秒被逐出
config.setMinEvictableIdleTimeMillis(60000);
参数含义
参数名 | 说明 | 示例值 |
---|---|---|
minIdle | 最小闲置对象数 | 0 |
timeBetweenEvictionRunsMillis | 逐出线程运行间隔 | 30000 |
minEvictableIdleTimeMillis | 空闲对象存活时间 | 60000 |
通过合理的配置,可以有效管理资源池对象的生命周期,防止资源浪费或内存泄漏,同时提升系统性能。
相关文章:
Apache Commons Pool :介绍与使用
Apache Commons Pool :介绍与使用 什么是 commons-pool2? commons-pool2 是 Apache Commons 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持,方便开发者管理资源(如数据库连接、网络连接等)复…...
(二)编译原生SDK以及配置交叉编译链
文章目录 编译原生SDKLinuxSDK的安装第一步解压LinuxSDK第二步安装依赖软件第三步解压Buildroot的dl文件 Linux系统镜像编译、生成第一步 配置编译环境第二步 编译 LinuxSDK编译上面配置好的 环境配置编译 LinuxSDK配置内核选项配置 Buildroot编译 Qt 库 编译生成 Linux 系统镜…...
YK人工智能(三)——万字长文学会torch深度学习
2.1 张量 本节主要内容: 张量的简介PyTorch如何创建张量PyTorch中张量的操作PyTorch中张量的广播机制 2.1.1 简介 几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是…...
【游戏设计原理】41 - 游戏的核心
1. 如何理解? 这条原理主要在讲述“游戏核心”这一概念的重要性及其在游戏开发中的作用。游戏的核心是指决定游戏整体玩法和体验的核心元素,它通常是游戏的主要机制、目标或动作方式。理解这一原理时,我们可以从以下几个层面来考虑ÿ…...
GraalVM:云原生时代的Java虚拟机
1. 概述 GraalVM是由Oracle公司开发的一款高性能、多语言的虚拟机平台。它不仅兼容传统的JVM字节码执行,还引入了即时编译(JIT)技术的革新,以及对多种编程语言的支持。GraalVM旨在通过提供更高效的执行环境来满足云计算环境中日益…...
goView二开低代码平台1.0
官网文档地址:GoView 说明文档 | 低代码数据可视化开发平台 简介:GoView 是一个拖拽式低代码数据可视化开发平台,通过拖拽创建数据大屏,使用Vue3框架,Ts语言和NaiveUI组件库创建的开源项目。安装步骤和地址文档里都有…...
【golang】go errors 处理错误追踪打印堆栈信息
目录 背景使用参考 背景 使用原生go语言编程时,常常需要处理错误,然而golang中没有像java/python等其他语言的try-catch方式一样的方式来处理异常事件,只能通过函数返回值接收并处理错误。 在实践中,由于牛马的不熟练或随意处理错…...
【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0
从你提供的 nslookup 输出看,DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0,这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因: 可能的原因和解决方法 本地 DNS 问题: 有可能是你的本…...
【Python系列】Python 连接 PostgreSQL 数据库并查询数据
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
深度学习利用Kaggle和Colab免费GPU资源训练
这两个平台,我先用的Colab,在修改完无数bug,成功训练完一个epoch后,超时了,查阅了官网资料,之后应该还可以用,但这个限制是动态的,你可能第二天就可以用,也没准下个月。遂…...
WebAssembly 学习笔记
WASM 概述 wasm最初是为了在浏览器获得接近原生的性能体验。 支持将其他语言实现的程序编译到wasm字节码,引入到浏览器由JS交互调用。 后又有了脱离JS的wasm运行时,可以直接运行wasm。 从而促成了wasm跨平台分发的能力。 但由于运行时的安全沙箱限制&a…...
二、github基础
Github基础 备用github.com网站一、用户界面-Overview(概览)1用户信息2 导航栏3 热门仓库4 贡献设置5贡献活动6搜索和筛选7自定义收藏8贡献统计9最近活动10其他链接 二、用户界面-Repositories(仓库)1 libusb_stm322 savedata3 Fi…...
「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计
智慧文旅运营综合平台,旨在通过集成大数据、云计算、物联网、人工智能等先进技术,为景区、旅游企业及相关管理机构提供一站式的智慧化运营服务。 智慧文旅运营综合平台不仅能够提升游客的游览体验,还能帮助景区管理者实现资源的优化配置和业务…...
《探寻真正开源的大模型:开启AI创新新纪元》
《探寻真正开源的大模型:开启AI创新新纪元》 一、开源大模型崛起:AI 发展的新曙光二、开源大模型的 “庐山真面目”三、明星开源大模型闪耀登场(一)LLaMA 3:实力强劲的开源先锋(二)Phi-3&#x…...
麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本
12月26日,2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者,共同探讨云计算产业发展方向和未来机遇,展示云计算标准化工作重要成果。 会上,云建设与应用领航计划(2024)建云用…...
C#如何操作数据库
C#如何操作数据库 前言1、查询操作2、增删改操作3、需要返回id主键的sql语句执行 前言 本文主要交代如何通过引用 using MySql.Data.MySqlClient;来操作数据库 需要导入.dll文件 例如:在本地Mysql下载目录下->Connecter NET 8.0->Assemblies->net5.0->…...
c++领域展开第八幕——类和对象(下篇 初始化列表、类型转换、static成员)超详细!!!!
文章目录 前言一、初始化列表二、类型转换三、static成员总结 前言 上篇博客我们实现了一个简单的日期类,基本的类和对象是清楚了 今天我们再来学习后面的一些类和对象的语法,慢慢的完善所学的东西 fellow me 一、初始化列表 • 之前我们实现构造函数时…...
termux-boot安卓开机自动启动应用
termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口(图中app为爱玩机工具箱) 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…...
Echart实现3D饼图示例
在可视化项目中,很多地方会遇见图表;echart是最常见的;这个示例就是用Echart, echart-gl实现3D饼图效果,复制即可用 //需要安装,再引用依赖import * as echarts from "echarts"; import echar…...
【JAVA】神经网络的基本结构和前向传播算法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
设计模式-抽象工厂模式
在设计模式中,抽象工厂模式(Abstract Factory Pattern)是一个非常常见且重要的模式,它属于创建型模式,用于提供创建一组相关或相互依赖对象的接口,而无需指定具体类。它的核心思想是将“创建对象”这一功能…...
webpack
前言 在现代前端开发的浪潮中,Webpack 已经成为一个不可或缺的构建工具。它不仅能够帮助我们打包 JavaScript 代码,还能够处理各种资源(如 CSS、图片、字体等),并提供一系列优化手段,极大地提升开发效率和…...
BLIP论文笔记
论文地址 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文思想 其实Clip就相当于只用了ITC...
Java List 集合详解:基础用法、常见实现类与高频面试题解析
正文 在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。 👉点击获取2024Java学习资料 1…...
HTML5 SSE
HTML5 SSE(Server-Sent Events,服务器发送事件)是一种允许服务器实时向浏览器推送数据的技术。它是HTML5规范的一部分,主要通过HTTP协议实现。SSE的主要特点包括: 单向通信:与WebSocket不同,SSE…...
SpringBoot篇(监控)
目录 学习前言 一、什么是监控? 二、监控的意义 1. 简介 2. 总结 3. 思考 三、可视化监控平台 1. 简介 2. 实操 2.1. 服务端开发 2.2. 客户端开发 配置多个客户端 2.3. 总结 2.4. 思考 四、监控原理 1. 简介 2. 总结 五、自定义监控指标 1. 简介…...
python23-常用的第三方库01:request模块-爬虫
requests 模块是 Python 中的一个第三方库,用于发送 HTTP 请求。 它提供了一个简单且直观的 API,使得发送网络请求和解析响应变得非常容易。requests 模块支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等,并且具有处理 cookies…...
【pytorch】现代卷积神经网络
文章目录 1 AlexNet2 VGG3 NiN4 GoogLeNet5 批量规范化batch normalization6 ResNet6.1 残差块6.2 resnet 7 DenseNet7.1 稠密块体7.2 过渡层7.3 DenseNet模型 1 AlexNet AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。 AlexNet使用ReLU而不…...
Excel 身份证号计算年龄
1. 设置身份证号列格式 复制身份证列值到记事本或其他地方重新设置身份证号列单元格格式为“文本”将复制出去的身份证号重新复制粘贴回来 2. 年龄列单元格中添加公式 DATEDIF(DATE(LEFT(MID(A2, 7, 8), 4), MID(MID(A2, 7, 8), 5, 2), RIGHT(MID(A2, 7, 8), 2)), TODAY(), …...
【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享
学术科研啥的要用到很多数据,nc文件融合了时间空间数据是科研重要文件。之前分享过怎样将nc文件处理成栅格后整理成表格。小编的读者还是有跑不通整个流程的,再来做一篇总结篇,也分享下练习数据跟工具,如果还是弄不了的࿰…...
WebRTC的线程模型
WebRTC中的线程类: Thread类: (1)Thread类中的数据: class Thread {// 消息队列:MessageList messages_; // 消息队列,所有需要线程处理的消息,都要先入队PriorityQueue delayed_m…...
活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化
课程介绍 参加“Microsoft Power Platform 在线技术公开课:实现业务流程自动化”活动,了解如何更高效地开展业务。参加我们举办的本次免费培训活动,了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…...
Docker安装(Docker Engine安装)
一、Docker Engine和Desktop区别 Docker Engine 核心组件:Docker Engine是Docker的核心运行时引擎,负责构建、运行和管理容器。它包括守护进程(dockerd)、API和命令行工具客户端(docker)。适用环境&#…...
Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)
一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …...
Llama系列关键知识总结
系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录Llama: Open and Efficient Foundation Language Models关键要点LLaMa模型架构:Llama2分组查询注意力 (G…...
分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath 引入jar包信息: flink-connector-oracle-cdc:3.2.1 flink:1.20.0 flink-table-runtime:1.20.0 flink-streaming-java:1.20.0 flink-clients:1.20.0 Exception in thread &q…...
Vue.js组件开发-怎样将style私有化
Vue.js组件开发中,将style私有可以通过使用<style scoped>来实现的。scoped属性会告诉Vue为这个组件的CSS样式添加一个数据属性,从而确保这些样式只应用于该组件的元素,而不会影响到其他组件或全局样式。 示例: 展示如何使…...
第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料
“挑战杯”被誉为大学生科技创新创业的“奥林匹克”盛会,它汇聚了来自各个学科、各个年级的精英人才。在这里,同学们带着对未知的好奇和对知识的渴望,组成一个个团队,向难题发起挑战。现在,第十届“挑战杯”大学生课外…...
从0入门自主空中机器人-2-1【无人机硬件框架】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验
硬件平台:征战Pro开发板 软件平台:Vivado2018.3 仿真软件:Modelsim10.6d 文本编译器:Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED,又名…...
【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)
****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 四、提示范式(Explanation for Prompting Paradigm) 随着语言模型规模的扩大,基于提示(prom…...
分布式算法(五):初识ZAB协议
文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…...
用Python操作字节流中的Excel工作簿
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...
PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架
PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架,支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容: http…...
MIT S081 Lab 2 System Calls
Lab链接 一 实现trace功能 1 题目要求 In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “ma…...
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库 目录 Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库一、配置…...
(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...
Hive性能调优考量
Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大,数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构…...
2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。
文章目录 sklearn学习(26) 模型选择与评估-交叉验证:评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…...