与数据库的连接未关闭

时间:2020-10-03 23:19:50

标签: redis rust

我正在使用“ redis-rs”进行防锈处理,并测试了在本地发送几千个请求 它在一开始就非常有效,只是在某些时候它停止接受请求 并在向Redis发送命令时开始向我显示此错误:

“通常只允许每个套接字地址(协议/网络地址/端口)使用一种”

我正在打开一个客户端,并在将其引入到HTTP服务器的每个请求上建立连接, 首先这可能不是一个好主意,但是连接不应该停止存在并在打开它的函数结束后关闭吗?

是否有更好的解决方案,例如某种全球连接?

谢谢

1 个答案:

答案 0 :(得分:0)

如果它是http服务器,那么您正在使用的板条箱可能正在执行多线程处理请求。就像另一个线程开始处理下一个请求一样,一个线程可能在关闭连接的过程中被捕获。

或者在您的情况下,到创建下一个连接时,远程数据库可能尚未完成关闭上一个请求。无论哪种方式,都更容易将其视为线程之间的竞争条件。

由于您不知道接下来哪个线程将请求连接,因此最好将连接存储为全局资源。由于我认为互斥锁比打开和关闭套接字快,因此我使用lazy_static创建了单线程安全连接。

use lazy_static::lazy_static;
use parking_lot::Mutex;
use std::sync::Arc;

lazy_static! {
    pub static ref LOCAL_DB: Arc<Mutex<Connection>> = {
        let connection = Connection::open("local.sqlite").expect("Unable to open local DB");
        connection.execute_batch(CREATE_TABLE).unwrap();
        Arc::new(Mutex::new(connection))
    };
}

// I can then just use it anywhere in functions without any complications.
let lock = LOCAL_DB.lock();
lock.execute_batch("begin").unwrap();
// etc.