Rust deadpool 连接池实现连接的时限管理

1,339 阅读1分钟

在 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() 方法,以实现连接池中连接对象的时限管理(限制连接的生命周期,包括最大和闲置)。可以见以下帖子:

github.com/bikeshedder…

github.com/bikeshedder…

github.com/bikeshedder…

使用时,可以将这几个库更新到最新版:

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 );
        }
    });