#async-await #pool #await #async #database

mobc

支持异步/await的通用连接池

44个版本

0.8.4 2024年4月9日
0.8.3 2023年10月19日
0.8.2 2023年8月29日
0.8.1 2023年1月21日
0.3.0 2019年11月30日

#180异步

Download history 18609/week @ 2024-04-24 13613/week @ 2024-05-01 8460/week @ 2024-05-08 6481/week @ 2024-05-15 7979/week @ 2024-05-22 8262/week @ 2024-05-29 6285/week @ 2024-06-05 8412/week @ 2024-06-12 8299/week @ 2024-06-19 6247/week @ 2024-06-26 7938/week @ 2024-07-03 9016/week @ 2024-07-10 8811/week @ 2024-07-17 7588/week @ 2024-07-24 9405/week @ 2024-07-31 8323/week @ 2024-08-07

每月 35,137 次下载
用于 40 个crate (30个直接使用)

MIT/Apache

48KB
915

Mobc

支持异步/await的通用连接池。

灵感来自Deadpool、Sqlx、r2d2和Golang SQL包。

变更日志

注意:mobc需要至少Rust 1.60。

用法

[dependencies]
mobc = "0.8"

# For async-std runtime
# mobc = { version = "0.8", features = ["async-std"] }

# For actix-rt 1.0
# mobc = { version = "0.8", features = ["actix-rt"] }

特性

  • 支持异步/.await语法
  • 同时支持tokioasync-std
  • 支持Tokio指标
  • 生产环境中经过战斗测试
  • 高性能
  • 易于定制
  • 动态配置

适配器

后端 适配器crate
bolt-client mobc-bolt
tokio-postgres mobc-postgres
redis mobc-redis
arangodb mobc-arangors
lapin mobc-lapin
reql mobc-reql
redis-cluster mobc-redis-cluster

欢迎提供更多数据库适配器。

示例

更多 示例

使用一个假想的"foodb"数据库。

use mobc::{async_trait, Manager};

#[derive(Debug)]
pub struct FooError;

pub struct FooConnection;

impl FooConnection {
    pub async fn query(&self) -> String {
        "PONG".to_string()
    }
}

pub struct FooManager;

#[async_trait]
impl Manager for FooManager {
    type Connection = FooConnection;
    type Error = FooError;

    async fn connect(&self) -> Result<Self::Connection, Self::Error> {
        Ok(FooConnection)
    }

    async fn check(&self, conn: Self::Connection) -> Result<Self::Connection, Self::Error> {
        Ok(conn)
    }
}

配置

max_open

设置池管理的最大连接数。

0表示无限,默认为10。

min_idle

设置池维护的最大空闲连接数。池将在任何时候最多维护这么多空闲连接,同时尊重max_open的值。

max_lifetime

设置池中连接的最大生命周期。过期的连接在重新使用之前可能会被懒加载关闭。

None表示永远重用,默认为None。

get_timeout

设置池使用的获取超时。Pool::get调用将等待这么长时间以等待连接可用,然后返回错误。

None表示永不超时,默认为30秒。

变量

一些连接池配置可以动态调整。每个连接池实例具有以下方法:

  • set_max_open_conns
  • set_max_idle_conns
  • set_conn_max_lifetime

Stats

  • max_open - 数据库的最大打开连接数。
  • connections - 已建立连接的数量,包括正在使用和空闲的。
  • in_use - 当前正在使用的连接数。
  • idle - 空闲连接数。
  • wait_count - 等待连接的总数。
  • wait_duration - 等待新连接的总阻塞时间。
  • max_idle_closed - 由于max_idle而关闭的总连接数。
  • max_lifetime_closed - 由于max_lifetime而关闭的总连接数。

Metrics

  • Counters
    • mobc_pool_connections_opened_total - 打开的连接池连接总数
    • mobc_pool_connections_closed_total - 关闭的连接池连接总数
  • Gauges
    • mobc_pool_connections_open - 当前打开的连接池连接数
    • mobc_pool_connections_busy - 当前忙碌的连接池连接数(执行数据库查询)
    • mobc_pool_connections_idle - 当前未使用的连接池连接数(等待下一次池查询运行)
    • mobc_client_queries_wait - 当前等待连接的查询数
  • Histograms
    • mobc_client_queries_wait_histogram_ms - 所有查询等待时间的直方图(毫秒)

Compatibility

由于tokio与其他运行时(如async-std)不兼容,因此使用tokio编写的数据库驱动程序不能在async-std运行时中运行。例如,由于使用tokio,因此不能在tide中使用redis-rs,因此基于redis-res的连接池也不能在tide中使用。

Dependencies

~5–19MB
~205K SLoC