在 Rust 后台程序的开发中,需要用到像 PostgreSQL、Redis 等数据库的连接池,目前比较好的选择是使用 deadpool 连接池,支持异步,支持 Tokio、async-std 等多种运行时,代码质量也很好。
deadpool: crates.io/crates/dead…
deadpool-postgres: crates.io/crates/dead…
deadpool-redis: crates.io/crates/dead…
deadpool 在最新的 0.9.5 版本中,增加了一个 Pool::retain() 方法,以实现连接池中连接对象的时限管理(限制连接的生命周期,包括最大和闲置)。可以见以下帖子:
使用时,可以将这几个库更新到最新版:
deadpool-postgres = "0.10"
deadpool-redis = "0.10"
deadpool = "0.9"
然后在创建连接池时,启动一个协程,定时地检查连接的时长,释放掉已超过时长的连接:
// 为数据库连接池设置连接有效时长1小时,避免数据库中连接内存持续增长
let interval = Duration::from_secs(30);
let max_idle = Duration::from_secs(60);
let max_age = Duration::from_secs(3600);
tokio::spawn(async move {
loop {
tokio::time::sleep(interval).await;
pool.retain(|_, metrics| metrics.last_used() < max_idle && metrics.age() < max_age );
}
});