#连接池 #postgresql # #异步池 #异步 #查询构建器

simple_pg_pool

为 tokio-postgres 设计的简单异步连接池

8 个版本 (4 个重大更改)

0.16.1 2024 年 5 月 2 日
0.16.0 2024 年 4 月 11 日
0.15.2 2024 年 3 月 3 日
0.15.0 2024 年 2 月 6 日
0.12.1 2024 年 1 月 8 日

#543数据库接口

Download history 6/week @ 2024-04-22 128/week @ 2024-04-29 7/week @ 2024-05-06 12/week @ 2024-05-20 8/week @ 2024-05-27 6/week @ 2024-06-03 4/week @ 2024-06-10 33/week @ 2024-07-22 4/week @ 2024-07-29 22/week @ 2024-08-05

每月 59 次下载
simple_pg 中使用

MIT/Apache

88KB
1.5K SLoC

simple_pg_pool

simple_pg 项目的更深入集成的 deadpool-postgres 的分支。

主要目标

  • 与 SQL 查询构建器深度集成。
  • 统一客户端类型,不再需要通用客户端。用 impl<Conn> 替代。
  • 提供通过模式宇宙进行快速并行单元测试的方法。
  • 针对我们的用例优化性能。
  • 通过减少单态化来减少增量编译时间。

特性

特性 描述 额外依赖项 默认
rt_tokio_1 启用对 tokio 包的支持 deadpool/rt_tokio_1
rt_async-std_1 启用对 async-std 包的支持 deadpool/rt_async-std_1
serde 启用对 serde 包的支持 deadpool/serde, serde/derive

重要: async-std 的支持目前仅限于 async-std 特定的超时函数。您仍然需要启用 async-std 中的 tokio1 功能才能使用此包与 async-std 一起使用。

示例

以下示例假设可以通过 UNIX 域套接字访问 PostgreSQL,并且在 pg_hba.conf 中启用了本地用户的 peer 身份验证。如果您正在运行 Windows,您可能需要在连接配置中指定 hostuserpassword,或使用其他 身份验证方法

use simple_pg_pool::{Config, Manager, ManagerConfig, Pool, RecyclingMethod, Runtime};
use simple_pg_client::NoTls;

#[tokio::main]
async fn main() {
    let mut cfg = Config::new();
    cfg.dbname = Some("deadpool".to_string());
    cfg.manager = Some(ManagerConfig { recycling_method: RecyclingMethod::Fast });
    let pool = cfg.create_pool(Some(Runtime::Tokio1), NoTls).unwrap();
    for i in 1..10 {
        let mut client = pool.get().await.unwrap();
        let stmt = client.prepare_cached("SELECT 1 + $1").await.unwrap();
        let rows = client.query(&stmt, &[&i]).await.unwrap();
        let value: i32 = rows[0].get(0);
        assert_eq!(value, i + 1);
    }
}

使用 configdotenv 包的示例

# .env
PG__DBNAME=deadpool
use simple_pg_pool::{Manager, Pool, Runtime};
use dotenv::dotenv;
# use serde_1 as serde;
use simple_pg_client::NoTls;

#[derive(Debug, serde::Deserialize)]
# #[serde(crate = "serde_1")]
struct Config {
    pg: simple_pg_pool::Config
}

impl Config {
    pub fn from_env() -> Result<Self, config::ConfigError> {
        config::Config::builder()
           .add_source(config::Environment::default().separator("__"))
           .build()?
           .try_deserialize()
    }
}

#[tokio::main]
async fn main() {
    dotenv().ok();
    let mut cfg = Config::from_env().unwrap();
    let pool = cfg.pg.create_pool(Some(Runtime::Tokio1), NoTls).unwrap();
    for i in 1..10 {
        let mut client = pool.get().await.unwrap();
        let stmt = client.prepare_cached("SELECT 1 + $1").await.unwrap();
        let rows = client.query(&stmt, &[&i]).await.unwrap();
        let value: i32 = rows[0].get(0);
        assert_eq!(value, i + 1);
    }
}

注意: 上面的代码使用 crate 名称 config_crate 是因为 config 功能,并且功能和依赖共享相同的命名空间。在你的代码中,你可能希望使用 ::config::ConfigError::config::Config 替代。

使用现有的 simple_pg_client::Config 对象的示例

use std::env;
use simple_pg_pool::{Manager, ManagerConfig, Pool, RecyclingMethod};
use simple_pg_client::NoTls;

#[tokio::main]
async fn main() {
    let mut pg_config = simple_pg_client::Config::new();
    pg_config.host_path("/run/postgresql");
    pg_config.host_path("/tmp");
    pg_config.user(env::var("USER").unwrap().as_str());
    pg_config.dbname("deadpool");
    let mgr_config = ManagerConfig {
        recycling_method: RecyclingMethod::Fast
    };
    let mgr = Manager::from_config(pg_config, NoTls, mgr_config);
    let pool = Pool::builder(mgr).max_size(16).build().unwrap();
    for i in 1..10 {
        let mut client = pool.get().await.unwrap();
        let stmt = client.prepare_cached("SELECT 1 + $1").await.unwrap();
        let rows = client.query(&stmt, &[&i]).await.unwrap();
        let value: i32 = rows[0].get(0);
        assert_eq!(value, i + 1);
    }
}

常见问题解答

  • 数据库无法访问。为什么池创建不会失败?

    Deadpool 具有与相同的启动和运行行为,因此池创建永远不会失败。

    如果你想在启动时应用程序崩溃而无法建立数据库连接,请在创建池后立即调用 pool.get().await

  • 为什么从池中检索的连接有时不可用?

    deadpool-postgres 0.5.5 中,实现了一种新的回收方法,自 0.8 以来成为默认设置。使用该方法,管理器在返回连接之前不再执行测试查询,而是完全依赖于 simple_pg_client::Client::is_closed。在罕见的情况下(例如,不可靠的网络),这可能导致 simple_pg_client 未注意到断开连接,并报告连接为可用。

    可以通过将 ManagerConfig::recycling_method 设置为 RecyclingMethod::Verified 来启用旧的和稍微慢一些的回收方法,或者在 config crate 中使用时,通过设置 PG__MANAGER__RECYCLING_METHOD=Verified 来启用。

  • 如何启用 tokio-postgres crate 的功能?

    确保你依赖于与 deadpool-postgres 相同版本的 tokio-postgres,并在你的 Crate.toml 文件中启用所需的功能

    [dependencies]
    deadpool-postgres = { version = "0.9" }
    tokio-postgres = { version = "0.7", features = ["with-uuid-0_8"] }
    

    重要: deadpool-postgrestokio-postgres 的版本号不一定匹配。如果它们匹配,这只是两个 crate 都具有相同的 MAJOR 和 MINOR 版本号的巧合。

    deadpool-postgres tokio-postgres
    0.7 – 0.12 0.7
    0.6 0.6
    0.4 – 0.5 0.5
    0.2 – 0.3 0.5.0-alpha
  • 如何清除语句缓存?

    你可以调用 pool.manager().statement_cache.clear() 来清除所有语句缓存,或者调用 pool.manager().statement_cache.remove() 从所有缓存中移除单个语句。

    重要: ClientWrapper 还提供了一个 statement_cache 字段,该字段具有 clear()remove() 方法,这些方法仅影响单个客户端。

许可证

根据您选择的以下之一进行许可:

任选其一。

依赖项

~6–16MB
~215K SLoC