C#连接池问题:从池中获取连接之前经过的超时时间



OrmLiteConnectionFactory负责创建一个新的SqlConnectionMaxConnectionPoolSize = 100PoolSize < 50

创建新连接的代码:

services.AddSingleton<IDbConnectionFactory>((IDbConnectionFactory)Activator.CreateInstance(typeof(OrmLiteConnectionFactory), connectionString));
services.AddScoped<IDbConnection>((provider) =>
{
var factory = provider.GetRequiredService<IDbConnectionFactory>();
var connection = factory.OpenDbConnection();
return connection;
});

有时在打开新连接时SqlClient会抛出:

System.InvalidOperationException: 'Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

调用堆栈:

at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at ServiceStack.OrmLite.OrmLiteConnection.Open()

因此,未达到最大连接池大小,但无法建立新连接。真的很感激任何想法。

每次应用程序运行数据库时,您必须确保关闭并处理SqlDataReaderSqlCommandSqlConnection对象。最简单的方法是在实现IDisposable的对象上使用Using关键字。否则,这些类型的对象将保留在内存中,直到垃圾收集器能够销毁它们。检查整个应用程序中的源代码以实现上述方法。

当我公司的客户调用我们的API时,同样的问题出现了,我不得不这么做!

连接池是机器范围的。是否有其他正在运行的应用程序或进程使用数据库连接?也许您的SQL Server有"最大工作线程数"限制?

否则,答案就是看看为什么这么多连接被使用了这么长时间。也许连接可以早点释放。

相关内容

最新更新