OrmLiteConnectionFactory
负责创建一个新的SqlConnection
。MaxConnectionPoolSize = 100
。PoolSize < 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()
因此,未达到最大连接池大小,但无法建立新连接。真的很感激任何想法。
每次应用程序运行数据库时,您必须确保关闭并处理SqlDataReader、SqlCommand和SqlConnection对象。最简单的方法是在实现IDisposable的对象上使用Using关键字。否则,这些类型的对象将保留在内存中,直到垃圾收集器能够销毁它们。检查整个应用程序中的源代码以实现上述方法。
当我公司的客户调用我们的API时,同样的问题出现了,我不得不这么做!
连接池是机器范围的。是否有其他正在运行的应用程序或进程使用数据库连接?也许您的SQL Server有"最大工作线程数"限制?
否则,答案就是看看为什么这么多连接被使用了这么长时间。也许连接可以早点释放。