Skip to main content

DbPools

Struct DbPools 

Source
pub struct DbPools { /* private fields */ }
Expand description

Database pool abstraction supporting read replicas.

Wraps primary and optional replica pools, providing methods for explicit read/write routing while maintaining backwards compatibility through Deref<Target = PgPool>.

§Examples

§Single Pool Configuration

use sqlx_pool_registry::sqlx::{self, PgPool};
use sqlx_pool_registry::DbPools;

let pool = PgPool::connect("postgresql://localhost/db").await?;
let pools = DbPools::new(pool);

// Both read() and write() return the same pool
assert!(!pools.has_replica());

§Primary/Replica Configuration

use sqlx_pool_registry::sqlx::{self, postgres::PgPoolOptions};
use sqlx_pool_registry::DbPools;

let primary = PgPoolOptions::new()
    .max_connections(5)
    .connect("postgresql://primary/db")
    .await?;

let replica = PgPoolOptions::new()
    .max_connections(10)
    .connect("postgresql://replica/db")
    .await?;

let pools = DbPools::with_replica(primary, replica);
assert!(pools.has_replica());

Implementations§

Source§

impl DbPools

Source

pub fn new(primary: PgPool) -> Self

Create a new DbPools with only a primary pool.

This is useful for development or when you don’t have a read replica configured. All read and write operations will route to the primary pool.

§Example
use sqlx_pool_registry::sqlx::{self, PgPool};
use sqlx_pool_registry::DbPools;

let pool = PgPool::connect("postgresql://localhost/db").await?;
let pools = DbPools::new(pool);
Source

pub fn with_replica(primary: PgPool, replica: PgPool) -> Self

Create a new DbPools with primary and replica pools.

Read operations will route to the replica pool for load distribution, while write operations always use the primary pool.

§Example
use sqlx_pool_registry::sqlx::{self, postgres::PgPoolOptions};
use sqlx_pool_registry::DbPools;

let primary = PgPoolOptions::new()
    .max_connections(5)
    .connect("postgresql://primary/db")
    .await?;

let replica = PgPoolOptions::new()
    .max_connections(10)
    .connect("postgresql://replica/db")
    .await?;

let pools = DbPools::with_replica(primary, replica);
Source

pub fn primary(&self) -> &PgPool

Get the primary pool.

Unlike write, this method describes the physical pool topology rather than the operation being routed. Both methods return the same pool for DbPools.

Source

pub fn replica(&self) -> Option<&PgPool>

Get the configured replica pool, if one exists.

This method does not fall back to the primary pool. Use read when a routable read pool is required.

Source

pub fn has_replica(&self) -> bool

Check if a replica pool is configured.

Returns true if a replica pool was provided via with_replica.

§Example
use sqlx_pool_registry::sqlx::{self, PgPool};
use sqlx_pool_registry::DbPools;

let pool = PgPool::connect("postgresql://localhost/db").await?;
let pools = DbPools::new(pool);
assert!(!pools.has_replica());
Source

pub async fn close(&self)

Close all database connections.

Closes both primary and replica pools (if configured).

§Example
use sqlx_pool_registry::sqlx::{self, PgPool};
use sqlx_pool_registry::DbPools;

let pool = PgPool::connect("postgresql://localhost/db").await?;
let pools = DbPools::new(pool);
pools.close().await;

Trait Implementations§

Source§

impl Clone for DbPools

Source§

fn clone(&self) -> DbPools

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DbPools

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for DbPools

Dereferences to the primary pool.

This allows natural usage like &*pools when you need a &PgPool. For explicit routing, use .read() or .write() methods.

Source§

type Target = Pool<Postgres>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl PoolProvider for DbPools

Source§

fn read(&self) -> &PgPool

Get a pool for read operations. Read more
Source§

fn write(&self) -> &PgPool

Get a pool for write operations. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more