如何使用actix在函数内部使用数据库池?
How to use pooling of database inside function using actix?
我为 MySQL 数据库创建了一个池,如下所示:
let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL");
let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create pool.");
像这样包含在actix中:
HttpServer::new(move || App::new()
.data(pool.clone()) // <-- HERE
.service(
web::resource("/infos")
.route(web::post().to(get_infos))
))
.bind("127.0.0.1:8080")?
.start();
println!("Starting http server: 127.0.0.1:8080");
问题来了,如何在这个信息函数中使用它:
pub fn get_infos(conn: &MysqlConnection) -> Vec<Book> {
all_books
.order(books::id.desc())
.load::<Book>(conn)
.expect("error loading the books")
}
直接将 MySQL 连接的一个实例传递给 get_infos 工作正常,但使用池我不知道如何处理它?!有什么帮助吗?
为了进一步说明,我的目标是使用 POOLING 而不是像这段代码中那样只使用一个实例:
let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL");
let conn = MysqlConnection::establish(&database_url).unwrap();
// And then passing as argument "conn" to get_infos function.
我在之前的代码中发起了POOL to actix:
.data(pool.clone()) // <-- HERE
但是如何将它作为参数传递给 get_infos
函数。
再次感谢您的帮助。
对于您的处理人员;只需将池添加为参数,然后就可以将固定连接传递给下游函数:
// Data = actix_web::web::Data
pub fn get_all_books(pool: Data<Pool>) -> HttpResponse {
let connection = pool.get().expect("Failed to get connection");
let books = get_infos(&connection);
HttpResponse::Ok().json(books)
}
pub fn get_infos(connection: &MysqlConnection) -> Vec<Book> {
all_books
.order(books::id.desc())
.load::<Book>(conn)
.expect("error loading the books")
}
通过控制器传递池的正确答案:
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create pool.");
HttpServer::new(move || {
App::new()
.data(pool.clone())
.route("/", web::get().to(index))
.configure(todoController::init)
})
这是有效的。
我为 MySQL 数据库创建了一个池,如下所示:
let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL");
let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create pool.");
像这样包含在actix中:
HttpServer::new(move || App::new()
.data(pool.clone()) // <-- HERE
.service(
web::resource("/infos")
.route(web::post().to(get_infos))
))
.bind("127.0.0.1:8080")?
.start();
println!("Starting http server: 127.0.0.1:8080");
问题来了,如何在这个信息函数中使用它:
pub fn get_infos(conn: &MysqlConnection) -> Vec<Book> {
all_books
.order(books::id.desc())
.load::<Book>(conn)
.expect("error loading the books")
}
直接将 MySQL 连接的一个实例传递给 get_infos 工作正常,但使用池我不知道如何处理它?!有什么帮助吗?
为了进一步说明,我的目标是使用 POOLING 而不是像这段代码中那样只使用一个实例:
let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL");
let conn = MysqlConnection::establish(&database_url).unwrap();
// And then passing as argument "conn" to get_infos function.
我在之前的代码中发起了POOL to actix:
.data(pool.clone()) // <-- HERE
但是如何将它作为参数传递给 get_infos
函数。
再次感谢您的帮助。
对于您的处理人员;只需将池添加为参数,然后就可以将固定连接传递给下游函数:
// Data = actix_web::web::Data
pub fn get_all_books(pool: Data<Pool>) -> HttpResponse {
let connection = pool.get().expect("Failed to get connection");
let books = get_infos(&connection);
HttpResponse::Ok().json(books)
}
pub fn get_infos(connection: &MysqlConnection) -> Vec<Book> {
all_books
.order(books::id.desc())
.load::<Book>(conn)
.expect("error loading the books")
}
通过控制器传递池的正确答案:
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create pool.");
HttpServer::new(move || {
App::new()
.data(pool.clone())
.route("/", web::get().to(index))
.configure(todoController::init)
})
这是有效的。