Purpose: Manage and reuse database connections efficiently
Problem Solved: High cost of creating/destroying connections
Pattern: Pool of pre-established, reusable database connections
Benefit: Improved performance and resource management
Why Connection Pooling Matters
Without Connection Pooling
High Overhead: Create new connection for each request
Resource Waste: Destroy connections after single use
Performance Impact: Connection establishment takes time
Scalability Issues: Limited by connection creation speed
Connection Creation Cost
Network Handshake: TCP connection establishment
Authentication: User credential verification
Session Setup: Database session initialization
Time Overhead: 10-100ms per connection
How Connection Pooling Works
Basic Flow
Pool Initialization: Create fixed number of connections at startup
Request Handling: Application requests connection from pool
Connection Checkout: Pool provides available connection
Operation Execution: Application uses connection for database operations
Connection Return: Application returns connection to pool
Reuse: Connection available for next request
Pool States
Available: Connection ready for use
In Use: Connection currently assigned to request
Idle: Connection open but not actively used
Invalid: Connection broken, needs replacement
Key Components
Pool Manager
Connection Factory: Creates new connections
Pool Maintenance: Monitors connection health
Allocation Strategy: Decides which connection to provide
Cleanup: Removes invalid connections
Connection Wrapper
Proxy Pattern: Intercepts connection operations
Return Handling: Ensures connection returns to pool
State Tracking: Monitors connection usage
Validation: Checks connection health
Pool Configuration Parameters
Size Parameters
Initial Size: Connections created at startup
Minimum Size: Always maintain this many connections
Maximum Size: Never exceed this limit
Increment Size: How many connections to add when growing
Timeout Parameters
Connection Timeout: Max time to wait for available connection
Idle Timeout: Max time connection can remain unused
Max Lifetime: Maximum age of any connection
Validation Timeout: Time limit for connection health checks
Validation Parameters
Test on Borrow: Validate before giving to application
Test on Return: Validate when returned to pool
Test While Idle: Periodic validation of idle connections
Validation Query: SQL query to test connection health
Pool Sizing Strategy
Factors to Consider
Concurrent Users: Number of simultaneous database operations
Application Threads: Thread pool size in application server
Database Limits: Maximum connections database can handle
Network Latency: Higher latency needs more connections
Sizing Formula
Optimal Pool Size = (Database Server CPU Cores × 2) + Effective Spindle Count
Typical Configurations
Small Applications: 5-10 connections
Medium Applications: 20-50 connections
Large Applications: 100-200 connections
Enterprise Systems: Many app instances with small pools behind a pooler (PgBouncer), so actual DB connections stay small (formula-sized). In Postgres each connection is a separate process, so 500+ direct connections hurts
HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");config.setUsername("user");config.setPassword("password");config.setMinimumIdle(5);config.setMaximumPoolSize(20);config.setConnectionTimeout(30000);config.setIdleTimeout(600000);config.setMaxLifetime(1800000);HikariDataSource dataSource = new HikariDataSource(config);