gpt4 book ai didi

postgresql - 如何防止BB8连接在多次重复后断开

转载 作者:行者123 更新时间:2023-12-03 11:49:17 33 4
gpt4 key购买 nike

我有一个应将共享连接池用于所有请求的应用程序。我观察到,在看似随机的时间,请求失败,错误类型为“已关闭”。我已将此行为隔离到以下示例中:

use lazy_static::lazy_static;

use bb8_postgres::bb8::Pool;
use bb8_postgres::PostgresConnectionManager;
use bb8_postgres::tokio_postgres::{NoTls, Client};

lazy_static! {
static ref CONNECTION_POOL: Pool<PostgresConnectionManager<NoTls>> = {
let manager = PostgresConnectionManager::new_from_stringlike("dbname=demodb host=localhost user=postgres", NoTls).unwrap();

Pool::builder().build_unchecked(manager)
};
}

fn main() {
println!("Hello, world!");
}


#[cfg(test)]
mod test {
use super::*;

#[tokio::test]
async fn much_insert_traffic() {
much_traffic("INSERT INTO foo(a,b) VALUES (1, 2) RETURNING id").await
}

#[tokio::test]
async fn much_select_traffic() {
much_traffic("SELECT MAX(id) FROM foo").await
}

#[tokio::test]
async fn much_update_traffic() {
much_traffic("UPDATE foo SET a = 81 WHERE id = 1919 RETURNING b").await;
}

async fn much_traffic(stmt: &str) {
let c = CONNECTION_POOL.get().await.expect("Get a connection");
let client = &*c;

for i in 0..10000i32 {
let res = client.query_opt(stmt, &[]).await.expect(&format!("Perform repeat {} of {} ok", i, stmt));
}
}

}

执行测试时,> 50%的测试之一将在以后的迭代中失败,并且输出类似于以下内容:

Perform repeat 8782 of UPDATE foo SET a = 81 WHERE id = 1919 RETURNING b ok: Error { kind: Closed, cause: None } thread 'test::much_update_traffic' panicked at 'Perform repeat 8782 of UPDATE foo SET a = 81 WHERE id = 1919 RETURNING b ok: Error { kind: Closed, cause: None }', src\main.rs:44:23

最佳答案

事实证明,问题完全取决于[tokio::test]批注,每当执行测试时,批注就启动一个独特的运行时。使用这些运行时之一来初始化惰性静态,并且一旦该运行时关闭,池就会被销毁。只要生成测试仍在运行,其他测试(具有不同的运行时)就可以使用该值,但是一旦关闭,它就会处于无效状态。

关于postgresql - 如何防止BB8连接在多次重复后断开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946098/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com