Пакет обновления System.Data.SqlClient с 4.6.1 до 4.8.0 заполняет пул соединений - PullRequest
1 голос
/ 20 января 2020

Мы запускаем 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).

...