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 提供的一个开源对象池实现框架。它旨在为应用程序提供通用的对象池支持,方便开发者管理资源(如数据库连接、网络连接等)复…...
sentinel-请求限流、线程隔离、本地回调、熔断
请求限流:控制QPS来达到限流的目的 线程隔离:控制线程数量来达到限流的目录 本地回调:当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 熔断:熔断也叫断路器,当失败、或者…...
微信小程序 app.json 配置文件解析与应用
目录 一、什么是 app.json? 二、app.json 文件的基本结构 三、详细解析 app.json 配置项 1. pages:小程序页面路径配置 2. window:窗口样式配置 3. tabBar:底部标签栏配置 4. networkTimeout:网络请求超时配置 …...
C语言-共用体(联合体)
1.共用体(联合体) 1.共用体union是一个能在同一个存储空间存储不同类型数据的类型 2.共用体所占的内存长度等于其最长成员的长度。 3.同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用 4.共用体变量中起作用的成员是最后一次存放的成员ÿ…...
C++算法知识点
创建队列: 关于队列的一些常用方法: 创建栈: 将字符串换成整数:...
芝法酱学习笔记(2.3)——shardingsphere分库分表
一、前言 之前的例子中,我们以一个简化了的销售单报表查询,展示了大数据量查询时,在索引和变量类型层面可以做的一些优化。可我们发现,无论怎么优化,一次查询都要好几秒。 这是一个现实问题,只要一个系统用…...
vue3+vite+nginx打包
在开发环境下,已经可以正常地运行一个有增删改查功能的页面了,但如何把它发布到运行服务器呢?仍有许多的问题需要探索。 网上很多文章给了很大的帮助,但总是没有说明原理,对于像我这样的初学者来说,不知其…...
爬虫与反爬虫实现全流程
我选取的网页爬取的是ppt nba版 需要的工具:pycharm,浏览器 爬虫需要观察它的网页信息,然后开始首先爬取它的html,可以看到有人气,标题,日期,咨询 可以看到用get方法 import requests url"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2…...
Kimi进行学术方向选择精讲!
目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中,小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后,肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法,将大量…...
湖北产教融合教育研究院重庆分院揭牌成立
百年大计,教育为本。为积极响应重庆市人才培养的迫切需求,充分发挥中国同等学力申硕综合服务领航者的专业优势,12月26日,湖北产教融合教育研究院重庆分院启动仪式在渝北区龙山一路278号祈年悦城4栋24层隆重举行。 湖北产教融合教育…...
探索CSS Houdini:下一代样式与动画技术
随着前端开发对用户体验的要求不断提高,传统的CSS在某些场景下难以满足开发者的高阶需求。在这种背景下,CSS Houdini 技术应运而生,为开发者提供了更高自由度和更强大的功能,开创了现代Web动画与样式的新可能。 什么是CSS Houdin…...
winserver搭建域环境
域环境的搭建 7.1理论知识 Windows Server 2008网络类型 工作组(Work Group) 在安装Windows系统的时候 ,工作组名一般为“workgroup”,也可以任意起个名字,在同一工作组或不同工作组在访问时也没有什么分别,在使用时&a…...
鸿蒙开发工程师成长的五个阶段
在科技日新月异的今天,鸿蒙(HarmonyOS)作为华为自主研发的操作系统,正以其独特的魅力和广阔的应用前景吸引着越来越多的开发者加入。鸿蒙不仅承载着华为对未来智能设备互联互通的愿景,也为开发者提供了一个充满挑战与机…...
Redis集成到SpingBoot 的数据结构常见操作
一.环境配置 1.依赖注入 2.yaml文件配置 3.启动本地Redis服务 (或在虚拟机上启动,这里为了方便演示在本地启动) 4.启动成功案例 5.创建一个Controller我们开始演示 RestController public class MyController {Autowiredprivate StringRedisTemplate redisTemplate;} 二 …...
输入输出(I/O):熟悉 Java 的 I/O 类库,尤其是 NIO 和文件操作
输入输出(I/O):熟悉 Java 的 I/O 类库,尤其是 NIO 和文件操作 在 Java 中,I/O(输入输出)操作是开发中非常重要的一部分,用于与文件、网络和其他数据流交互。Java 提供了传统的 I/O&…...
mysql建立主从集群
mysql建立主从集群需要多个mysql服务器,主从数据库是通过log日志来进行同步的,所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件,给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…...
Python AI 教程之四:无监督学习
什么是无监督学习? 无监督学习是机器学习的一个分支,用于处理未标记的数据。与监督学习(其中数据被标记为特定类别或结果)不同,无监督学习算法的任务是在不了解数据含义的情况下寻找数据中的模式和关系。这使得无监督学习成为探索性数据分析的强大工具,其目标是了解数据…...
ReactiveStreams、Reactor、SpringWebFlux
注意: 本文内容于 2024-12-28 21:22:12 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持! ReactiveStreams是…...
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下) 前言一. 信号槽的误用导致崩溃的常见原因1.信号和槽连接的对象被提前释放案例解决方法 2.参数类型不匹配案例解决方法 3. 多线程信号槽使用不当案例解决方法 4. 信号重复…...
opencv(cpp) Mat使用总结
opencv访问矩阵的通道数 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创建一个3通道的彩色图像(例如,BGR格式)cv::Mat colorImage cv::Mat::zeros(100, 100, CV_8UC3);// 创建一个单通道的灰度图像cv::M…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
