Diesel: PooledConnection рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдирд╡ре░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: diesel-rs/diesel

рдореИрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдореЗрдВ PooledConnection рд▓рдкреЗрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

`std::ptr::NonNull<pq_sys::pg_conn>` cannot be shared between threads safely
within `r2d2::PooledConnection<embedded_migrations::diesel::r2d2::ConnectionManager<embedded_migrations::diesel::PgConnection>>`, the trait `std::marker::Sync` is not implemented for `std::ptr::NonNull<pq_sys::pg_conn>`
required because it appears within the type `embedded_migrations::diesel::pg::connection::raw::RawConnection`
required because it appears within the type `embedded_migrations::diesel::PgConnection`
required because it appears within the type `r2d2::Conn<embedded_migrations::diesel::PgConnection>`
required because it appears within the type `std::option::Option<r2d2::Conn<embedded_migrations::diesel::PgConnection>>`
required because it appears within the type `r2d2::PooledConnection<embedded_migrations::diesel::r2d2::ConnectionManager<embedded_migrations::diesel::PgConnection>>`
required because of the requirements on the impl of `std::marker::Send` for `&r2d2::PooledConnection<embedded_migrations::diesel::r2d2::ConnectionManager<embedded_migrations::diesel::PgConnection>>`
required because of the requirements on the impl of `std::marker::Send` for `std::sync::Mutex<&r2d2::PooledConnection<embedded_migrations::diesel::r2d2::ConnectionManager<embedded_migrations::diesel::PgConnection>>>`

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдореИрдВ рдХрд┐рд╕реА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП: рд╕рдВрднрд╡рддрдГ рдЖрдк рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ Pool рдХреЗ рдмрдЬрд╛рдп PooledConnection рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдереНрд░реЗрдб рдХреЗ рднреАрддрд░ рд╕реЗ get() рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1

async fn execute(pool: &Pool<ConnectionManager<PgConnection>>, data: SomeData) -> Result<(), Error> {
    diesel::insert_into(some_table)
        .values(data)
        .execute(&pool.get()?)?;

    Ok(())
}

рдЙрджрд╛рд╣рд░рдг 2

pub struct Database {
    pool: Pool<ConnectionManager<PgConnection>>,
}

impl Database {
    async fn insert_some_data(&self, data: SomeData) -> Result<(), Error> {
        diesel::insert_into(some_table)
            .values(data)
            .execute(&self.conn.get()?)?;

        Ok(())
    }
}

рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП r2d2 рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ: https://docs.diesel.rs/r2d2/

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд╣ "рдбрд┐рдЬрд╛рдЗрди" рджреНрд╡рд╛рд░рд╛ рд╣реИред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреЗрд╡рд▓ рдереНрд░реЗрдбрд╕реЗрдл рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП: рд╕рдВрднрд╡рддрдГ рдЖрдк рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ Pool рдХреЗ рдмрдЬрд╛рдп PooledConnection рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдереНрд░реЗрдб рдХреЗ рднреАрддрд░ рд╕реЗ get() рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1

async fn execute(pool: &Pool<ConnectionManager<PgConnection>>, data: SomeData) -> Result<(), Error> {
    diesel::insert_into(some_table)
        .values(data)
        .execute(&pool.get()?)?;

    Ok(())
}

рдЙрджрд╛рд╣рд░рдг 2

pub struct Database {
    pool: Pool<ConnectionManager<PgConnection>>,
}

impl Database {
    async fn insert_some_data(&self, data: SomeData) -> Result<(), Error> {
        diesel::insert_into(some_table)
            .values(data)
            .execute(&self.conn.get()?)?;

        Ok(())
    }
}

рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП r2d2 рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ: https://docs.diesel.rs/r2d2/

рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП: рдЖрдк _probably_ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, $#$ PooledConnection $#$ рдХреЗ рдмрдЬрд╛рдп Pool рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдереНрд░реЗрдб рдХреЗ рднреАрддрд░ рд╕реЗ get() рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1

async fn execute(pool: &Pool<ConnectionManager<PgConnection>>, data: SomeData) -> Result<(), Error> {
    diesel::insert_into(some_table)
        .values(data)
        .execute(&pool.get()?)?;

    Ok(())
}

рдЙрджрд╛рд╣рд░рдг 2

pub struct Database {
    pool: Pool<ConnectionManager<PgConnection>>,
}

impl Database {
    async fn insert_some_data(&self, data: SomeData) -> Result<(), Error> {
        diesel::insert_into(some_table)
            .values(data)
            .execute(&self.conn.get()?)?;

        Ok(())
    }
}

рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП r2d2 рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ: https://docs.diesel.rs/r2d2/

&pool.get рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж ()

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

kollapsderwellenfunktion picture kollapsderwellenfunktion  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pjenvey picture pjenvey  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

killercup picture killercup  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pwoolcoc picture pwoolcoc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mkroman picture mkroman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ