29 releases (4 breaking)

✓ Uses Rust 2018 edition

new 0.5.7 Mar 27, 2020
0.5.3 Jan 17, 2020
0.4.1 Dec 29, 2019
0.3.0 Nov 30, 2019

#18 in Asynchronous

Download history 411/week @ 2019-12-02 1120/week @ 2019-12-09 553/week @ 2019-12-16 543/week @ 2019-12-23 312/week @ 2019-12-30 1699/week @ 2020-01-06 1655/week @ 2020-01-13 2049/week @ 2020-01-20 1284/week @ 2020-01-27 1509/week @ 2020-02-03 1552/week @ 2020-02-10 1280/week @ 2020-02-17 932/week @ 2020-02-24 345/week @ 2020-03-02 331/week @ 2020-03-09 656/week @ 2020-03-16

4,755 downloads per month
Used in 5 crates

MIT/Apache

44KB
919 lines

mobc

A generic connection pool with async/await support.

Inspired by r2d2 and Golang SQL package.

Build Status crates.io

Documentation

Changelog

Note: mobc requires at least Rust 1.39.

Usage

[dependencies]
mobc = "0.5"

# For async-std runtime
# mobc = { version = "0.5", features = ["async-std"] }

Features

  • Support async/.await syntax
  • Support both tokio and async-std
  • High performance
  • Easy to customize
  • Dynamic configuration
Backend Adaptor Crate
tokio-postgres mobc-postgres
redis mobc-redis

Configures

max_open

Sets the maximum number of connections managed by the pool.

0 means unlimited, defaults to 10.

min_idle

Sets the maximum idle connection count maintained by the pool. The pool will maintain at most this many idle connections at all times, while respecting the value of max_open.

max_lifetime

Sets the maximum lifetime of connections in the pool. Expired connections may be closed lazily before reuse.

None meas reuse forever, defaults to None.

get_timeout

Sets the get timeout used by the pool. Calls to Pool::get will wait this long for a connection to become available before returning an error.

None meas never timeout, defaults to 30 seconds.

Variable

Some of the connection pool configurations can be adjusted dynamically. Each connection pool instance has the following methods:

  • set_max_open_conns
  • set_max_idle_conns
  • set_conn_max_lifetime

Stats

  • max_open - Maximum number of open connections to the database.
  • connections - The number of established connections both in use and idle.
  • in_use - The number of connections currently in use.
  • idle - The number of idle connections.
  • wait_count - The total number of connections waited for.
  • wait_duration - The total time blocked waiting for a new connection.
  • max_idle_closed - The total number of connections closed due to max_idle.
  • max_lifetime_closed - The total number of connections closed due to max_lifetime.

Compatibility

Because tokio is not compatible with other runtimes, such as async-std. So a database driver written with tokio cannot run in the async-std runtime. For example, you can't use redis-rs in tide because it uses tokio, so the connection pool which bases on redis-res can't be used in tide either.

Examples

More examples

Using an imaginary "foodb" database.

use mobc::{async_trait, Manager};

#[derive(Debug)]
pub struct FooError;

pub struct FooConnection;

impl FooConnection {
    pub async fn query(&self) -> String {
        "PONG".to_string()
    }
}

pub struct FooManager;

#[async_trait]
impl Manager for FooManager {
    type Connection = FooConnection;
    type Error = FooError;

    async fn connect(&self) -> Result<Self::Connection, Self::Error> {
        Ok(FooConnection)
    }

    async fn check(&self, conn: Self::Connection) -> Result<Self::Connection, Self::Error> {
        Ok(conn)
    }
}

Dependencies

~3.5MB
~71K SLoC