1 个稳定版本
1.0.0 | 2022年5月1日 |
---|
#155 在 数据库实现
27KB
393 行代码(不含注释)
Whitepool - 一个健壮的Rust+Tokio工作池工厂
-
Whitepool是一个针对Rust+Tokio的轻量级、通用连接池库,注重简洁性、性能和稳健的故障恢复。
-
Whitepool受Elixir/Erlang Poolboy的启发,几乎所有Elixir/Erlang数据库库都依赖它来实现连接池
示例
#[tokio::main]
async fn main() {
let pool_size = 7;
let max_overflow = 4;
// Create a session for communicate with pool channel
let session = Pool::new(pool_size,
max_overflow,
|| {Box::pin(async move {
// tokio_postgres create connection
let (client, connection) =
tokio_postgres::connect("host=localhost user=postgres", NoTls)
.await.unwrap();
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});
// return client
client
})}).await.run_service();
// session.clone() internally call channel mpsc::Sender::Clone
process(session.clone()).await;
process(session.clone()).await;
process(session.clone()).await;
// wait until all pending checkout handled, then shutdown
session.safe_shutdown().await
tokio::time::sleep(Duration::from_secs(100)).await;
}
pub async fn process(session: Session<Client>) {
// Checkout a resource from Pool
// block_checkout don't block your scheduler
// just await on oneshot with timeout
if let Ok(mut client) = session.block_checkout().await {
// ============== start ===================
let _rows = client
.get()
.query("SELECT $1::TEXT", &[&"hello world"])
.await.unwrap();
// ============== end ===================
// after job done, call checkin
let _ = session.checkin(client).await;
// OR if resource destroy, call this
// session.destroyed(resource).await;
}
}
选项
pool_size
:最大池大小max_overflow
:如果池为空时创建的最大工作者数量factory
:创建工作者的闭包
作者
- DanyalMh
许可证
本软件根据Apache License,版本2.0(以下简称“许可证”)许可;除非符合许可证规定,否则不得使用本文件。您可以在以下网址获取许可证副本:https://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”提供,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、权限和限制,请参阅许可证。
依赖项
~2.3–4MB
~66K SLoC