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 在 数据库接口 中
每月 59 次下载
在 simple_pg 中使用
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,您可能需要在连接配置中指定 host
、user
和 password
,或使用其他 身份验证方法。
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);
}
}
使用 config
和 dotenv
包的示例
# .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-postgres
和tokio-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()
方法,这些方法仅影响单个客户端。
许可证
根据您选择的以下之一进行许可:
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖项
~6–16MB
~215K SLoC