1个不稳定版本
0.5.0 | 2020年1月30日 |
---|
#61 in #postgres
210KB
4.5K SLoC
kpgres
为Kayrx提供的原生、异步的PostgreSQL客户端
lib.rs
:
异步、管道化的PostgreSQL客户端。
行为
在其本身上调用方法,如 Client::query
,并不会做任何事情。关联的请求不会发送到数据库,直到该方法返回的未来被首次轮询。请求的执行顺序是它们首次轮询的顺序,而不是创建未来的顺序。
管道化
客户端支持 管道化 请求。在需要执行多个独立查询的使用场景中,管道化可以提高性能。在传统的工作流程中,每个查询在上一查询完成后才会发送到服务器。相比之下,管道化允许客户端在最初就向服务器发送所有查询,最小化了一方等待另一方发送数据的时间。
Sequential Pipelined
| Client | Server | | Client | Server |
|----------------|-----------------| |----------------|-----------------|
| send query 1 | | | send query 1 | |
| | process query 1 | | send query 2 | process query 1 |
| receive rows 1 | | | send query 3 | process query 2 |
| send query 2 | | | receive rows 1 | process query 3 |
| | process query 2 | | receive rows 2 | |
| receive rows 2 | | | receive rows 3 | |
| send query 3 | |
| | process query 3 |
| receive rows 3 | |
在这两种情况下,PostgreSQL服务器都是顺序执行查询的 - 管道化只是允许在可能的情况下连接的两端并发工作。
当未来被并发轮询时(例如,通过使用futures join
组合器),管道化会自动发生。
use futures::future;
use std::future::Future;
use kpgres::{Client, Error, Statement};
async fn pipelined_prepare(
client: &Client,
) -> Result<(Statement, Statement), Error>
{
future::try_join(
client.prepare("SELECT * FROM foo"),
client.prepare("INSERT INTO bar (id, name) VALUES ($1, $2)")
).await
}
SSL/TLS支持
TLS支持通过外部库实现。 Client::connect
和 Config::connect
将TLS实现作为参数。当不需要TLS时,可以使用此crate中的 NoTls
类型。否则, postgres-openssl
和 postgres-native-tls
crate提供了由 openssl
和 native-tls
crate支持的实现。
依赖
~33MB
~771K SLoC