#clickhouse #pooling #tokio #connection-pool #config

clickhouse-connection-pool

A connection pooling library for ClickHouse in Rust, built on top of deadpool

1 unstable release

new 0.1.0 Mar 27, 2025

#1306 in Database interfaces

MIT/Apache

43KB
985 lines

ClickHouse Connection Pool


Clickhouse Connection Pool

A connection pooling library for ClickHouse in Rust, built on top of deadpool.

Features

  • Connection Pooling: Efficiently reuse existing connections for improved performance
  • Auto-Retry: Automatic retries with exponential backoff
  • Health Checks: Periodic health checks to ensure connections are healthy
  • Metrics Integration: Prometheus-compatible metrics for monitoring
  • Graceful Shutdown: Graceful shutting down and clean up of existing connections
  • Thread Safety: Support for concurrency

Installation

Add this to your Cargo.toml:

[dependencies]
clickhouse-connection-pool = "0.1.0"

Quickstart

use clickhouse_connection_pool::{ClickHouseConfig, ClickHousePool, RetryConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create configuration
    let config = ClickHouseConfig::new(
        "localhost".to_string(),
        9000,
        "default".to_string(),
        "default".to_string(),
        "".to_string(),
    );
    
    // Configure retry policy
    let retry_config = RetryConfig::default();

    let datalake_config = DatalakeConfig::new(config, retry_config);
    
    // Create pool
    let pool = ClickhouseConnectionPool::new(
        config,
        retry_config,
        None, // Optional metrics
    );
    
    // Initialize pool (creates initial connections)
    pool.initialize().await?;
    
    // Check examples/simple-clickhouse for more notes
    // on how to utilize PoolManager for retries
    // with exponential backoff

    // Graceful shutdown (waits for in-use connections)
    pool.shutdown().await?;
    
    Ok(())
}

Configuration

ClickHouseConfig

let config = ClickHouseConfig::new(
    "localhost".to_string(),  // Host
    9000,                    // Port
    "my_database".to_string(), // Database name
    "username".to_string(),   // Username
    "password".to_string(),   // Password
);

// Set timeouts
config.connect_timeout_seconds = 10;
config.query_timeout_seconds = 30;

RetryConfig

let retry_config = RetryConfig {
    max_retries: 3,
    initial_backoff_ms: 100,
    max_backoff_ms: 5000,
    backoff_multiplier: 2.0,
};

Connection Health and Statistics

// Get current pool status
let status = pool.status();
println!("Active connections: {}", status.size);
println!("Available connections: {}", status.available);

// Get detailed statistics
let stats = pool.stats();
println!("Active: {}, In use: {}, Waiters: {}", 
    stats.size, stats.in_use, stats.waiters);

Dependencies

~20–33MB
~600K SLoC