使用 r2d2 在 rust/diesel 应用程序中实现连接池
Imlementing connection pooling in a rust/diesel app with r2d2
我正在尝试在 rust/diesel/rocket 应用程序中实现连接池。我不知道如何保证establish_pooled_connection()
方法的内容只被调用一次,从而准备好连接池。
这是我的代码。
来自lib.rs:
pub fn establish_pooled_connection() -> PooledConnection<ConnectionManager<PgConnection>> {
dotenv().ok();
let database_url = env::var("DB_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();
return conn;
}
这里我用的是上面的方法在main.rs:
#[get("/", format = "json")]
fn find_all() -> Json<Vec<Person>> {
let connection = establish_pooled_connection();
let all: QueryResult<Vec<Person>> = person::table().get_results(&connection);
...
这里的问题是每个 get
方法(例如上面)调用 establish_pooled_connection()
并且一切都被重新实例化...
我来自 java 依赖注入允许我们避免重新实例化的世界。
在 rust/diesel 应用程序中实现连接池的正确方法是什么?
您不会在每个处理程序中创建新连接,而是使用框架的一些状态共享机制。
有关如何在 Rocket 中使用状态的指南,请参阅 here,这将是一个很好的起点。
我正在尝试在 rust/diesel/rocket 应用程序中实现连接池。我不知道如何保证establish_pooled_connection()
方法的内容只被调用一次,从而准备好连接池。
这是我的代码。
来自lib.rs:
pub fn establish_pooled_connection() -> PooledConnection<ConnectionManager<PgConnection>> {
dotenv().ok();
let database_url = env::var("DB_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();
return conn;
}
这里我用的是上面的方法在main.rs:
#[get("/", format = "json")]
fn find_all() -> Json<Vec<Person>> {
let connection = establish_pooled_connection();
let all: QueryResult<Vec<Person>> = person::table().get_results(&connection);
...
这里的问题是每个 get
方法(例如上面)调用 establish_pooled_connection()
并且一切都被重新实例化...
我来自 java 依赖注入允许我们避免重新实例化的世界。
在 rust/diesel 应用程序中实现连接池的正确方法是什么?
您不会在每个处理程序中创建新连接,而是使用框架的一些状态共享机制。
有关如何在 Rocket 中使用状态的指南,请参阅 here,这将是一个很好的起点。