Repository

r2d2

A generic connection pool for Rust

Backend
Adaptor Crate
rust-postgres
r2d2-postgres
redis-rs
use r2d2 feature of redis-rs
rust-memcache
r2d2-memcache

Specs

  • BackendAdaptor Crate
  • rust-postgresr2d2-postgres
  • redis-rsuse r2d2 feature of redis-rs
  • rust-memcacher2d2-memcache
  • rust-mysql-simpler2d2-mysql
  • rusqliter2d2-sqlite
  • rsfbclientr2d2-firebird
  • rusted-cypherr2d2-cypher
  • dieseldiesel::r2d2 ( docs )
  • couchdbr2d2-couchdb

README

r2d2

CircleCI

A generic connection pool for Rust.

Documentation

Opening a new database connection every time one is needed is both inefficient
and can lead to resource exhaustion under high traffic conditions. A connection
pool maintains a set of open connections to a database, handing them out for
repeated use.

r2d2 is agnostic to the connection type it is managing. Implementors of the
ManageConnection trait provide the database-specific logic to create and
check the health of connections.

A (possibly not exhaustive) list of adaptors for different backends:

Backend Adaptor Crate
rust-postgres r2d2-postgres
redis-rs use r2d2 feature of redis-rs
rust-memcache r2d2-memcache
rust-mysql-simple r2d2-mysql
rusqlite r2d2-sqlite
rsfbclient r2d2-firebird
rusted-cypher r2d2-cypher
diesel diesel::r2d2 (docs)
couchdb r2d2-couchdb

mongodb (archived)
use official mongodb driver instead | r2d2-mongodb
(deprecated: official driver handles pooling internally)
odbc | r2d2-odbc
jfs | r2d2-jfs
oracle | r2d2-oracle
ldap3 | r2d2-ldap
duckdb-rs | use r2d2 feature of duckdb-rs

Example

Using an imaginary "foodb" database.

use std::thread;

extern crate r2d2;
extern crate r2d2_foodb;

fn main() {
    let manager = r2d2_foodb::FooConnectionManager::new("localhost:1234");
    let pool = r2d2::Pool::builder()
        .max_size(15)
        .build(manager)
        .unwrap();

    for _ in 0..20 {
        let pool = pool.clone();
        thread::spawn(move || {
            let conn = pool.get().unwrap();
            // use the connection
            // it will be returned to the pool when it falls out of scope.
        })
    }
}

License

Licensed under either of

  • Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
  • MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you shall be dual licensed as above, without any
additional terms or conditions.