Мы запускаем Core ASP. net API-контроллер под netcoreapp2.2, и все работает нормально. После последнего обновления пакетов NuGet мы столкнулись с множеством тайм-аутов подключения нашего бэкэнда. Более глубокий просмотр журналов показал, что появилось следующее сообщение об ошибке:
Истекло время ожидания. Период ожидания истек до получения соединения из пула. Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.
Также благодаря этой замечательной статье от Michael мы проверили все спящие подключения на нашем сервере , Из-за того, что этот SQL сервер больше не обслуживает клиентов, мы просто удалили базу данных и имя программы из предложения where, чтобы увидеть все висячие соединения:
-- From : Michael J Swart (https://sqlperformance.com/2017/07/sql-performance/find-database-connection-leaks)
declare @database_name sysname = N'YOUR_DATABASE_NAME_HERE';
declare @program_name sysname = N'.Net SqlClient Data Provider';
select
datediff(SECOND, s.last_request_end_time, getdate()) as seconds_asleep,
s.last_request_start_time as lastreq,
s.session_id,
db_name(s.database_id) as database_name,
s.host_name,
s.host_process_id,
t.text as last_sql,
s.program_name
from sys.dm_exec_connections c
join sys.dm_exec_sessions s
on c.session_id = s.session_id
cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) t
where s.is_user_process = 1
and s.status = 'sleeping'
--and db_name(s.database_id) = @database_name
--and program_name = @program_name
and datediff(second, s.last_request_end_time, getdate()) > 60
order by s.last_request_end_time;
И мы нашли больше затем 100 спящих соединений, которые спят более 6000 секунд, заполняя пул соединений. После проверки всех изменений, которые мы сделали между последним дефектным выпуском и предыдущим, мы предположили, что пакет NuGet System.Data.SqlClient . Поэтому мы сделали исправление, в котором мы понизили версию только этого пакета и выпустили новую версию. После этих выходных контроллер API все еще работает, и проверка пула соединений с помощью приведенного выше сценария показывает менее 10 соединений в целом с тайм-аутом ожидания менее 300 секунд.
Таким образом, кажется, что после 4.6.1 ошибка в этой библиотеке (я не проверял 4.7.0, так что, возможно, она уже есть), которая приводит к этим ошибкам объединения (по крайней мере, если вы используете Core 2.2 и используете EF core 2.2.6).