v / vlib / pool / README.md
152 lines · 119 sloc · 4.27 KB · 7039081d66b63e5c914b640d93e620889a18a693
Raw

Connection Pool Module

This module provides a robust connection pooling implementation for managing reusable resources like database connections. It handles connection lifecycle, validation, and efficient resource allocation with minimal overhead.

Features

Basic Usage

Creating a Pool

import db.mysql
import pool
import time

// Define your connection factory function
fn create_conn() !&pool.ConnectionPoolable {
    config := mysql.Config{
        host:     '127.0.0.1'
        port:     3306
        username: 'root'
        password: '12345678'
        dbname:   'mysql'
    }
    db := mysql.connect(config)!
    return &db
}

// Configure pool parameters
config := pool.ConnectionPoolConfig{
    max_conns:      50
    min_idle_conns: 5
    max_lifetime:   2 * time.hour
    idle_timeout:   30 * time.minute
    get_timeout:    5 * time.second
}

// Create connection pool
mut my_pool := pool.new_connection_pool(create_conn, config)!

// Acquire connection
mut conn := my_pool.get()!

// Convert `conn` to a `mysql.DB` object
mut db := conn as mysql.DB

// Use connection `db`
// ... your operations ...
// db.exec()

// Return connection to pool
my_pool.put(conn)!

// When application exits
my_pool.close()

Configuration Options

| Parameter | Default Value | Description | |---------------------|-----------------------|--------------------------------------| | max_conns | 20 | Maximum connections in pool | | min_idle_conns | 5 | Minimum idle connections to maintain | | max_lifetime | 1 hour | Max connection lifetime | | idle_timeout | 30 minutes | Idle connection timeout | | get_timeout | 5 seconds | Connection acquisition timeout | | retry_base_delay | 1 second | Base delay for connection retries | | max_retry_delay | 30 seconds | Maximum retry delay | | max_retry_attempts| 5 | Maximum connection creation attempts |

Advanced Features

Dynamic Configuration Update

new_config := pool.ConnectionPoolConfig{
    max_conns: 100
    min_idle_conns: 10
    // ... other parameters ...
}

my_pool.update_config(new_config)!

Connection Recovery Signal

// After connection maintenance/outage
my_pool.signal_recovery_event()

Statistics Monitoring

stats := my_pool.stats()
println("Active connections: ${stats.active_conns}")
println("Idle connections: ${stats.idle_conns}")
println("Waiting clients: ${stats.waiting_clients}")

Implementation Notes

  1. Exponential Backoff: Connection creation uses exponential backoff with jitter
  2. Priority Eviction: Four priority levels for connection cleanup:
    • low: Routine maintenance
    • medium: Connection acquisition failure
    • high: Configuration changes
    • urgent: Connection recovery events
  3. Adaptive Cleanup: Maintenance thread dynamically adjusts processing frequency
  4. Wait Queue: Fair connection allocation to waiting clients
  5. Atomic Operations: Non-blocking statistics tracking

Performance Considerations

Example Implementation

// ConnectionPoolable connection interface implementation
struct MyConnection {
    // Your connection state
}

fn (mut c MyConnection) validate() !bool {
    // Connection health check logic
    return true
}

fn (mut c MyConnection) close() ! {
    // Physical close logic
}

fn (mut c MyConnection) reset() ! {
    // Reset connection to initial state
}