我有简单的代码可以创建与 Firebird 的连接(任何版本,从 2.5 到 5.0)。
C#、x64、FbConnection、1000 个连接,一切正常:
List<FbConnection> fbList = new List<FbConnection>();
for (int i = 1; i <= 1000; i++)
{
try
{
var connection = new FbConnection("User=SYSDBA;Password=masterkey;Database=localhost/3053:c:\\rollcontrol\\rollcontrol;Pooling=false; MinPoolSize=0;MaxPoolSize=2000");
connection.Open();
fbList.Add(connection);
Console.WriteLine(i.ToString());
}
catch (Exception e)
{
Console.WriteLine(DateTime.Now.ToString() + ": " + e.ToString());
}
}
C#、x64、OdbcConnection、1000 个连接,进程在 180 个连接上停止(没有错误,进程只是挂起):
List<OdbcConnection> odbcList = new List<OdbcConnection>();
for (int i = 1; i <= 1000; i++)
{
try {
OdbcConnection DbConnection = new OdbcConnection("DSN=rollcontrol");
DbConnection.Open();
odbcList.Add(DbConnection);
Console.WriteLine(i.ToString());
} catch (Exception e) {
Console.WriteLine(DateTime.Now.ToString() + ": " + e.ToString());
}
}
ODBC对连接数有限制吗?也许,可以增加连接数限制吗?
更新
Firebird ODBC 驱动程序出现问题。它工作不稳定。与 MS Sql Server 的连接工作正常
正如您报告的问题中所阐述的,这是一个仅在管理员(SYSDBA 和指定 RDB$ADMIN 角色的用户)创建的连接中发生的错误。
驱动程序尝试通过请求 isc_info_user_names
来查找连接的当前
real用户,这对于管理员来说会报告当前服务器进程中与当前数据库的所有连接的用户名,而不仅仅是当前连接的用户名,这会导致截断,而驱动程序没有(或者由于您的拉取请求而没有)正确处理该截断。
作为解决方法,您可以执行以下操作之一:
使用非管理员用户
使用Firebird ClassicServer(在
ServerMode = Classic
中指定firebird.conf
)。
在 ClassicServer 模式下,每个连接都有自己的进程,因此
isc_info_user_names
信息请求仅报告一位用户,即使对于管理员也是如此。