1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-23 23:51:06 +01:00

use r2d2 for diesel example

This commit is contained in:
Nikolay Kim 2018-04-01 08:20:15 -07:00
parent a5a36ff194
commit b2e771df2c
3 changed files with 19 additions and 7 deletions

View File

@ -15,5 +15,7 @@ serde = "1.0"
serde_json = "1.0"
serde_derive = "1.0"
diesel = { version = "1.0.0-beta1", features = ["sqlite"] }
diesel = { version = "1.0", features = ["sqlite"] }
r2d2 = "0.8"
r2d2-diesel = "1.0"
dotenv = "0.10"

View File

@ -4,12 +4,14 @@ use diesel;
use actix_web::*;
use actix::prelude::*;
use diesel::prelude::*;
use r2d2::Pool;
use r2d2_diesel::ConnectionManager;
use models;
use schema;
/// This is db executor actor. We are going to run 3 of them in parallel.
pub struct DbExecutor(pub SqliteConnection);
pub struct DbExecutor(pub Pool<ConnectionManager<SqliteConnection>>);
/// This is only message that this actor can handle, but it is easy to extend number of
/// messages.
@ -37,14 +39,16 @@ impl Handler<CreateUser> for DbExecutor {
name: &msg.name,
};
let conn: &SqliteConnection = &self.0.get().unwrap();
diesel::insert_into(users)
.values(&new_user)
.execute(&self.0)
.execute(conn)
.expect("Error inserting person");
let mut items = users
.filter(id.eq(&uuid))
.load::<models::User>(&self.0)
.load::<models::User>(conn)
.expect("Error loading person");
Ok(items.pop().unwrap())

View File

@ -10,6 +10,8 @@ extern crate serde_json;
extern crate serde_derive;
#[macro_use]
extern crate diesel;
extern crate r2d2;
extern crate r2d2_diesel;
extern crate uuid;
extern crate futures;
extern crate actix;
@ -21,6 +23,7 @@ use actix_web::{http, middleware,
App, HttpServer, HttpRequest, HttpResponse, Error, AsyncResponder};
use diesel::prelude::*;
use r2d2_diesel::ConnectionManager;
use futures::future::Future;
mod db;
@ -53,12 +56,15 @@ fn index(req: HttpRequest<State>) -> Box<Future<Item=HttpResponse, Error=Error>>
fn main() {
::std::env::set_var("RUST_LOG", "actix_web=info");
let _ = env_logger::init();
env_logger::init();
let sys = actix::System::new("diesel-example");
// Start 3 db executor actors
let addr = SyncArbiter::start(3, || {
DbExecutor(SqliteConnection::establish("test.db").unwrap())
let manager = ConnectionManager::<SqliteConnection>::new("test.db");
let pool = r2d2::Pool::builder().build(manager).expect("Failed to create pool.");
let addr = SyncArbiter::start(3, move || {
DbExecutor(pool.clone())
});
// Start http server