Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 与数据库的连接未关闭_Redis_Rust - Fatal编程技术网

Redis 与数据库的连接未关闭

Redis 与数据库的连接未关闭,redis,rust,Redis,Rust,我使用“redis rs”来处理rust,并测试了在本地发送几千个请求 而且它在最初的几个阶段运行得非常好,只是在某些时候它会停止接受请求 当我向redis发送命令时,开始显示此错误: “每个套接字地址(协议/网络地址/端口)通常只允许使用一次” 我正在打开一个客户端和一个与接收它们的http服务器的每个请求的连接, 首先,这可能是一个坏主意,但是连接不应该停止存在并在打开它的函数结束后关闭吗 有没有更好的解决方案,比如某种全球联系 谢谢如果它是http服务器,那么您使用的板条箱可能正在执行多线

我使用“redis rs”来处理rust,并测试了在本地发送几千个请求 而且它在最初的几个阶段运行得非常好,只是在某些时候它会停止接受请求 当我向redis发送命令时,开始显示此错误:

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

我正在打开一个客户端和一个与接收它们的http服务器的每个请求的连接, 首先,这可能是一个坏主意,但是连接不应该停止存在并在打开它的函数结束后关闭吗

有没有更好的解决方案,比如某种全球联系


谢谢

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

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

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

使用lazy\u static::lazy\u static;
使用停车场::互斥;
使用std::sync::Arc;
懒惰的人!{
发布静态参考本地_DB:Arc={
let connection=connection::open(“local.sqlite”).expect(“无法打开本地数据库”);
connection.execute_batch(CREATE_TABLE).unwrap();
Arc::新建(互斥体::新建(连接))
};
}
//然后我就可以在函数中的任何地方使用它,而不会出现任何复杂情况。
设lock=LOCAL_DB.lock();
lock.execute_batch(“begin”).unwrap();
//等等。

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

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

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

使用lazy\u static::lazy\u static;
使用停车场::互斥;
使用std::sync::Arc;
懒惰的人!{
发布静态参考本地_DB:Arc={
let connection=connection::open(“local.sqlite”).expect(“无法打开本地数据库”);
connection.execute_batch(CREATE_TABLE).unwrap();
Arc::新建(互斥体::新建(连接))
};
}
//然后我就可以在函数中的任何地方使用它,而不会出现任何复杂情况。
设lock=LOCAL_DB.lock();
lock.execute_batch(“begin”).unwrap();
//等等。

哦,这似乎会有帮助。锁是不是意味着如果发生另一个请求并且它被锁定了,它只会出错?我更喜欢使用
停车场
板条箱,因为它的性能比标准库
std::sync
稍好一些。它提供不同的功能,具体取决于您希望如何处理锁定失败
.lock()
只会阻塞当前线程,直到锁可用并且不会导致错误。如果不想阻止线程,也可以使用
。请改为尝试锁定()。如果调用时无法获得互斥锁,则返回
None
。我明白了,谢谢你的详细回复,我将尝试一下,尝试一下实现它,但我似乎有一些问题,因为Arc互斥体在itOh内部有一个选项,这似乎会有帮助。锁呢。但是,它是否意味着如果发生另一个请求,并且它被锁定,它只会出错?我更喜欢使用
停车场
板条箱,因为它的性能比标准库
std::sync
稍好一些。它提供不同的功能,具体取决于您希望如何处理锁定失败
.lock()
只会阻塞当前线程,直到锁可用并且不会导致错误。如果不想阻止线程,也可以使用
。请改为尝试锁定()。如果调用时无法获得互斥锁,则返回
None
。我明白了,谢谢你的详细回复,我将尝试它,并尝试实现它,但是我似乎有一些问题,因为Arc互斥体在itHi@getpo.st中有一个选项。如果您能提供,可能会有所帮助。答案可能取决于您使用连接的方式、同步/异步环境、http framework.Hi@getpo.st。如果您能提供,可能会有所帮助。答案可能取决于您使用连接的方式、同步/异步环境和http框架。