A connection pool in FirebirdClient seems to be broken. It should queue my queries when is already empty but I get an exception instead. I need a help how to deal with this problem.
I'm using FirebirdClient version 7.1.1. I am running a console .Net Core app (version 2.2.0) and I am connecting Firebird 3.0. I execute 4 concurrent queries. I have MaxPoolSize set to 2. So there is not enough connections to execute all queries.
using System;
using System.Threading.Tasks;
using FirebirdSql.Data.FirebirdClient;
namespace ConsoleApp3
{
class Program
{
private const string connStr =
"User=SYSDBA;Password=***;Database=/opt/firebird/bases/db.fdb;DataSource=192.168.2.1;Port=3050;Connection lifetime=15;Pooling=true; MinPoolSize=0;MaxPoolSize=2;";
private static void Connect(string name)
{
Console.WriteLine($">>>>>>STARTING>>>>>>>>>>>> {name}");
var cmd = new FbCommand(
"select count(*) from MON$ATTACHMENTS a where a.mon$remote_process like '%ConsoleApp3.dll'");
using (cmd.Connection = new FbConnection(connStr))
{
try
{
cmd.Connection.Open();
var id = Convert.ToInt32(cmd.ExecuteScalar());
Task.Delay(1000);
Console.WriteLine($">>>>>>Done>>>>>>>>>>>> {name} RESULT {id}");
}
catch (Exception e)
{
Console.WriteLine($">>>>>>>ERROR>>>>>>>>>>> {name}");
Console.WriteLine(e);
}
}
}
static void Main(string[] args)
{
var t1 = Task.Run(() => Connect("conn1"));
var t2 = Task.Run(() => Connect("conn2"));
var t3 = Task.Run(() => Connect("conn3"));
var t4 = Task.Run(() => Connect("conn4"));
Task.WaitAll(t1, t2, t3, t4);
Console.WriteLine(">>>>>>>>>>>> DONE>>>>>>>>>>>>>>>");
Console.ReadKey();
}
}
}
I expect that queries that don't have free connection will be queued and executed when the connection to database will be reclaimed to the connection pool but instead I get a following exception:
System.InvalidOperationException: Connection pool is full.
at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.CreateNewConnectionIfPossibleImpl(ConnectionString connectionString)
at FirebirdSql.Data.FirebirdClient.FbConnectionPoolManager.Pool.GetConnection(FbConnection owner)
at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
at ConsoleApp3.Program.Connect(String name) in C:\Projects\ConsoleApp3\ConsoleApp3\Program.cs:line 22