C# 无法打开一个连接:超时已过期。从池中获取连接之前经过的超时时间

C# 无法打开一个连接:超时已过期。从池中获取连接之前经过的超时时间,c#,sql-server,multithreading,entity-framework,dbcontext,C#,Sql Server,Multithreading,Entity Framework,Dbcontext,我在多线程服务器应用程序中使用Entity Framework 6.4.4连接到internet上另一台服务器上的SQL server数据库 在使用DbContext之前,我通过调用MyDbContext.Database.connection.open()打开连接。多个线程可能试图同时打开连接。但有时我会收到InvalidOperationException类型的异常,消息为:Timeout expired。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且达

我在多线程服务器应用程序中使用Entity Framework 6.4.4连接到internet上另一台服务器上的SQL server数据库

在使用DbContext之前,我通过调用
MyDbContext.Database.connection.open()
打开连接。多个线程可能试图同时打开连接。但有时我会收到InvalidOperationException类型的异常,消息为:
Timeout expired。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且达到了最大池大小。


我确信我在使用后会关闭所有连接,并且没有连接保持打开状态超过2秒。而且,我确信没有太多的同时连接

SQL Server可以同时支持大约1500个连接(我已经测试过了),但我认为问题在于打开的连接没有太多打开的连接。


我在一台CPU为40个逻辑处理器的服务器上测试了我的应用程序。它很好用。但是,当我将应用程序移动到具有4个逻辑处理器的服务器上时,它会正常工作一段时间,但在一段时间后,它甚至无法打开一个连接。我将尝试同时打开连接的线程数限制为偶数3个。尽管如此,这并没有起到任何作用,我不断地遇到这种异常。CPU使用率始终低于50%,并且有可用内存。

您可能有代码来关闭连接并试图关闭连接,但很可能是某些逻辑错误导致您无法关闭连接。如果没有任何代码,很难知道原因,但是您可以使用SQL Server profiler(包含在SQL Server Management Studio中)并执行一些跟踪,检查连接的打开和关闭。您还可以对IDbConnections进行一些阅读。IDbConnections是IDisposable的,通常只应在
中使用(…){…}
块。听起来好像您有打开连接但不关闭连接的代码,这会导致连接池中的连接耗尽。如果EF服务器是基于Windows的,则可以激活并监视以监视未释放回连接池的连接。这是否回答了您的问题?您必须在使用完
块后立即使用
块处理连接,不要缓存它们谢谢@Cleptus。我发现了我的问题。线程在lock语句上被LCOCKED,所有线程都在等待新的DB连接。但由于达到最大池连接大小,无法建立新连接。只要在连接字符串中为最大池大小设置一个较高的数字,我的问题就解决了。