?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Как выглядит мина-ловушка в .NET Framework уровня "enterprise"?
kelijah
Мина образуется при сочетании двух вещей.

1. БД MS SQL, в которой сделана хранимая процедура на T-SQL, в которой сделан цикл, внутри которого заботливо оставлен PRINT. Ну чтобы в SSMS ручками запускать и удобненько диагностику читать. Надо, чтобы в тестах этот цикл выполнялся не очень много и не вызвал подозрений.

2. Прога, использующая SqlConnection + SqlCommand и вызывающая эту самую хранимку.

В прекрасный июльский день деплоймент-инженер на удаленной площадке, разворачивая и тестируя софт в очередном боевом окружении, сообщает вам радостную весть - веб-сервис валится по OutOfMemory. Вы смотрите в лог, а там дружище log4net говорит, что падает при выполнении SqlCommand, которая делает просто вызов хранимки. Ну не может такого же быть, думаете вы. Хранимка выполняется на сервере? На сервере. Память выжирается на клиенте? На клиенте. Ваш коллега совершенно четко вам сообщает, что MSSQLSERVER кушает свои положенные 8 Гб и ни капли больше, в SSMS эта хранимка вызывается и отрабатывает без проблем. А жрет клиентский 32-битный процесс.

А через денек вы натыкаетесь на описание, из которого следует, что в общем-то это - фича: "SqlCommand ExecuteNonQuery throws OutOfMemoryException". Клиент СУБД под .NET молча вытягивает все то, чем PRINT гадит в БД. И чтобы не делать так, надо немного настроить коннекшн. Хотя при этом ломается ограничение на таймаут...