Я ненавижу даже приносить это b/c, так много сотен страниц рассказывают об этой ошибке, начиная с 7-8 лет... Однако я не могу это понять.
У меня есть служба отчетов, работающая на сервере A, которая подключается к SQL Server 2008 R2 на сервере B. Оба сервера работают под управлением Windows Server 2008. Служба отчетов является многопоточной и содержит до 10 отчетов за каждый раз на своем собственный поток.
Строка подключения следующая:
Data Source=ServerB;Initial Catalog=DBName;trusted_connection=YES;Connection Timeout=0;Max Pool Size=500;
Как вы видите, я установил таймаут соединения на 0, чтобы дождаться соединения до его доступности, а максимальный размер пула до 500 бит/с. Я хотел убедиться, что пул не слишком мал для моей многопоточной службы, Ошибка обычно появляется только при запуске службы и появляется очередь ожидающих обработки отчетов.
Таким образом, очевидно, что первое, что нужно сделать, это искать утечки соединений. Должны быть соединения, которые не закрываются, которые заставляют пул заполняться, правильно? Nope-views, как пул, никогда не заполняется.
Я провел последние несколько часов работы монитора производительности на сервере, наблюдая за "Поставщиком данных .NET для SqlServer", а NumberOfPooledConnections никогда не становится выше 20 или около того. У меня также есть perfmon, запущенный на SQL-сервере, наблюдая "SQLServer: Общая статистика", а UserConnections никогда не превышает 50. За это время я сообщал об этой ошибке 2 или 3 раза, вручную перезапустив службу.
Что еще я могу найти? Что еще может вызвать эту ошибку? Полное сообщение об ошибке:
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.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
Спасибо, Стивен