Home

Awesome

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:

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
mongodb (archived)<br>use official mongodb driver insteadr2d2-mongodb<br>(deprecated: official driver handles pooling internally)
odbcr2d2-odbc
jfsr2d2-jfs
oracler2d2-oracle
ldap3r2d2-ldap
duckdb-rsuse 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

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.