5 个版本
0.7.4-alpha.4 | 2023年7月22日 |
---|---|
0.7.4-alpha.3 | 2023年7月16日 |
0.7.3 | 2023年3月10日 |
#1506 在 异步
53 每月下载量
用于 quaint-forked
48KB
925 行
Mobc Forked
这是对原始 Mobc 的分支,修复了稳定性问题。这改变了 Mobc 的设计,使用信号量来管理池,而不是原始设计使用的通道。
支持异步/await 的通用连接池。
灵感来源于 Deadpool、Sqlx、r2d2 和 Golang SQL 包。
注意:mobc 至少需要 Rust 1.39。
用法
[dependencies]
mobc = { git = "https://github.com/prisma/mobc", branch = "main"}
# For async-std runtime
# mobc = { git = "https://github.com/prisma/mobc", features = ["async-std"] }
# For actix-rt 1.0
# mobc = { git = "https://github.com/prisma/mobc", features = ["actix-rt"] }
特性
- 支持 async/.await 语法
- 支持
tokio
和async-std
- 高性能
- 易于定制
- 动态配置
适配器
后端 | 适配器 Crate |
---|---|
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 会在返回错误之前等待这么长时间,直到可用连接出现。
无表示永不超时,默认为30秒。
变量
一些连接池配置可以动态调整。每个连接池实例都有以下方法
- set_max_open_conns
- set_max_idle_conns
- set_conn_max_lifetime
统计
- max_open - 数据库的最大打开连接数。
- connections - 正在使用和空闲的已建立连接数。
- in_use - 当前正在使用的连接数。
- idle - 空闲连接数。
- wait_count - 等待连接的总次数。
- wait_duration - 等待新连接的总阻塞时间。
- max_idle_closed - 由于 max_idle 而关闭的总连接数。
- max_lifetime_closed - 由于 max_lifetime 而关闭的总连接数。
兼容性
由于 tokio 与其他运行时(如 async-std)不兼容,因此使用 tokio 编写的数据库驱动程序不能在 async-std 运行时中运行。例如,由于它使用 tokio,因此不能在 tide 中使用 redis-rs,因此基于 redis-res 的连接池也不能在 tide 中使用。
依赖项
~5–20MB
~233K SLoC