#postgresql #sql #async

kpgres

为Kayrx提供的原生、异步的PostgreSQL客户端

1个不稳定版本

0.5.0 2020年1月30日

#61 in #postgres

MIT 许可证

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::connectConfig::connect 将TLS实现作为参数。当不需要TLS时,可以使用此crate中的 NoTls 类型。否则, postgres-opensslpostgres-native-tls crate提供了由 opensslnative-tls crate支持的实现。

依赖

~33MB
~771K SLoC