如何解决缓存 sqlx 池会导致文件句柄溢出
我计划有一个使用 sqlite 数据库作为数据文件的应用程序。 因为可以更频繁地打开不同的文件,所以我想缓存连接。
我对 Rust 很陌生;这是我的第一个项目... 我的问题是:有时当我用完文件句柄时,我无法创建新的数据库文件。
到目前为止我尝试过的:
- test1(),只有在我为 MyPool 实现 Drop 时才有效。 Drop 将关闭连接池。通过这样做,我确信文件句柄再次获得自由。
- test2(),是我的项目需要的异步版本(它将是一个 Rocket 应用程序)。在这里,我一点也不成功。
// Cargo.toml
// tokio = { version = "1",features = ["rt-multi-thread","macros" ] }
// futures = "0.3"
// sqlx = { version = "0.5",features = [ "runtime-tokio-native-tls","sqlite","migrate" ] }
use sqlx::{migrate::MigrateDatabase,sqlite::sqlitePoolOptions,Pool,sqlite};
use futures::executor::block_on;
use std::sync::{Arc,Mutex};
#[derive(Clone)]
struct MyPool(Pool<sqlite>);
impl Drop for MyPool {
fn drop(&mut self) {
println!("**** drop");
block_on(
self.0.close()
);
}
}
#[tokio::main]
async fn main() {
test1().await;
//test2().await;
}
async fn test1() {
let mut pool: Vec<MyPool> = Vec::new();
for i in 1..1000 {
let db_name = format!("./db.{}.db",i);
sqlite::create_database(&db_name)
.await.expect(format!("create {} Failed",i).as_str());
let conn = sqlitePoolOptions::new()
.max_connections(5)
.connect(&db_name).await.expect(format!("connect {} Failed",i).as_str());
if pool.len() == 10 {
println!("Clenup");
pool.clear();
}
println!("{}",i);
pool.push(MyPool(conn));
}
}
async fn test2() {
let pool: Arc<Mutex<Vec<MyPool>>> = Arc::new(Mutex::new(Vec::new()));
let tasks: Vec<_> = (0..1000)
.map(|i| {
let my_pool = pool.clone();
tokio::spawn(async move {
let db_name = format!("./db.{}.db",i);
sqlite::create_database(&db_name)
.await.expect(format!("create {} Failed",i).as_str());
let conn = sqlitePoolOptions::new()
.max_connections(5)
.connect(&db_name).await.expect(format!("connect {} Failed",i).as_str());
{
let mut locked_pool = my_pool.lock().expect("locked");
if locked_pool.len() == 10 {
println!("Clenup");
locked_pool.clear();
}
println!("{}",i);
locked_pool.push(MyPool(conn));
}
})
}).collect();
// Wait for all tasks to complete.
futures::future::join_all(tasks).await;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。