#pool #connection-pool #database #worker-pool

whitepool

轻量级、通用的Rust+Tokio连接池库,受Elixir的poolboy启发

1 个稳定版本

1.0.0 2022年5月1日

#155数据库实现

Apache-2.0

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