using System.Collections.Concurrent;
using System.Threading.Tasks;
public class MockDatabaseConnection : IDisposable
private static int _connectionId = 0;
public MockDatabaseConnection()
_id = Interlocked.Increment(ref _connectionId);
Console.WriteLine($"Connection {_id} created.");
Console.WriteLine($"Connection {_id} disposed.");
public Task ExecuteQueryAsync(string query)
Console.WriteLine($"Connection {_id} executing query: {query}");
public class DatabaseConnectionPool
private readonly SemaphoreSlim _semaphore;
private readonly ConcurrentBag<MockDatabaseConnection> _connections;
private readonly int _maxConnections;
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
private int _idleConnections;
public DatabaseConnectionPool(int maxConnections)
_maxConnections = maxConnections;
_semaphore = new SemaphoreSlim(maxConnections);
_connections = new ConcurrentBag<MockDatabaseConnection>();
public async Task<MockDatabaseConnection> GetConnectionAsync(int timeoutMilliseconds = 1000)
if (!await _semaphore.WaitAsync(timeoutMilliseconds))
throw new TimeoutException("Timeout waiting for connection.");
if (_connections.TryTake(out MockDatabaseConnection connection))
Interlocked.Decrement(ref _idleConnections);
Console.WriteLine("Reusing existing connection.");
Console.WriteLine("Creating new connection.");
return new MockDatabaseConnection();
public async Task ReturnConnectionAsync(MockDatabaseConnection connection)
_connections.Add(connection);
Interlocked.Increment(ref _idleConnections);
public void LogConnectionStatus()
Console.WriteLine($"Active connections: {_maxConnections - _semaphore.CurrentCount}");
Console.WriteLine($"Idle connections: {_idleConnections}");
static async Task Main(string[] args)
var connectionPool = new DatabaseConnectionPool(10);
var tasks = new Task[100];
for (int i = 0; i < 100; i++)
tasks[i] = Task.Run(async () =>
var connection = await connectionPool.GetConnectionAsync();
await connection.ExecuteQueryAsync("SELECT * FROM table");
await connectionPool.ReturnConnectionAsync(connection);
Console.WriteLine($"Error: {ex.Message}");
await Task.WhenAll(tasks);
connectionPool.LogConnectionStatus();