【发布时间】:2021-10-31 08:06:16
【问题描述】:
我目前正在学习 Rust 和 Rocket
使用 Rust 1.54.0+Rocket 0.5.0_rc1+ Diesel 1.4.7 + r2d2 0.8.9
我用 r2d2 创建了一个 DB Postgres 连接池。我想在请求/路由之间共享连接池,为此我正在尝试使用 Rocket Managed State。 https://rocket.rs/v0.5-rc/guide/state/#managed-state
我创建了一个数据库连接池,将其保存在状态中,但是当我尝试从路由访问该数据库连接池时。我在同一行出现 2 个错误
Cell<i32> cannot be shared between threads safely
RefCell<HashMap<StatementCacheKey<Pg>, pg::connection::stmt::Statement>> cannot be shared between threads safely
这是我的代码
pub async fn establish_pooled_connection() -> Result<PooledConnection<ConnectionManager<PgConnection>>, r2d2_diesel::Error> {
dotenv().ok();
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
let manager = ConnectionManager::<PgConnection>::new(&database_url);
let pool = r2d2::Pool::builder().build(manager).expect("Failed to create pool.");
let conn = pool.clone().get().unwrap();
Ok(conn)
}
struct DBPool{
db_pool: PooledConnection<ConnectionManager<PgConnection>>
}
#[rocket::main]
async fn main() {
let pool = establish_pooled_connection();
rocket::build()
.mount("/",routes![callapi])
.manage(DBPool{db_pool: pool})
.launch()
.await.ok();
}
#[post("/callapi", data = "<request>")]
async fn callapi(request: RequestAPI<'_>, _dbpool: &State<DBPool>) -> Json<models::api_response::ApiResponse> {
......
错误是针对这个参数的
_dbpool: &State<DBPool>
提前致谢
【问题讨论】:
-
请提供minimal reproducible example。特别是
State是什么?还要编辑您的问题以添加 full 错误消息,包括上下文和编译器提出的建议。 -
@Jmb 我已经更新了问题,有更多细节,如果您有任何问题,请告诉我,谢谢
-
请包含 complete 错误消息,它应该以类似以下内容开头:“错误[E0277]:
Cell<i32>不能在线程之间安全共享”并以:“错误:由于先前的错误而中止”。请包括中间的所有行,它们对于我们了解错误的来源很重要。
标签: rust rust-diesel rust-rocket r2d2