Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ / 8 сообщений из 8, страница 1 из 1
04.12.2017, 14:09:30
    #39563692
Andret
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
Приветствую! При использовании sp_set_session_context/SESSION_CONTEXT на нашем продуктиве регулярно стала появляться ошибка (из сабжа).
При попытке её повторить выяснил как она появляется.
Если вызвать любой подобный "тепличный" код из Microsoft SQL Server Management Studio , то всё будет замечательно :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare	@context_debug nvarchar(4000) =  replicate('Z', 2000), @i int = 0
while	@i < 10000
begin
	set	@i+=1
	exec	sp_set_session_context N'context_debug', @context_debug;
	exec	sp_set_session_context N'context_debug', null;
	-- if @i % 1000 = 0 print concat(@i, ' @context_debug=', @context_debug)
end
print concat(@i, ' last context_debug=', cast(isNull(session_context(N'context_debug'), 'NULL') as nvarchar(4000)))



Но! Если это сделать вот таким кодом из клиента (пример на PowerShell для ясности), то легко добиться ошибки :

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Clear-Host
$ServerName = ".\SQL2017"
$SqlConnection = New-Object system.data.SqlClient.SQLConnection("App=test-context;Server=$ServerName; Integrated Security=SSPI;Pooling=false");
$SqlCommand2 = New-Object System.Data.SqlClient.SqlCommand("exec sp_set_session_context N'context_debug', null;", $SqlConnection)
try {
    $SqlConnection.Open();
    for ($i = 1; $i -le 10000; $i++) {
        $r = $SqlCommand2.ExecuteNonQuery()
        if ($i % 1000 -eq 0) {
            Write-Host "i = $i; "  -NoNewline -ForegroundColor Green
        }
    }
}
catch {
    Write-Host "ERROR Code = " -NoNewline -ForegroundColor Yellow
    Write-Host $_.Exception.InnerException.Number -ForegroundColor Yellow
    Write-Host $_.Exception.Message -ForegroundColor Red
}
finally {
    Write-Host  "Last i = $i" -ForegroundColor Blue
    $SqlConnection.Close()
    $SqlConnection.Dispose()
}



Результат из PSi = 1000; i = 2000; ERROR Code = 15665
Исключение при вызове "ExecuteNonQuery" с "0" аргументами: "Значение ключа "context_debug" не было задано, так как общий размер ключей и значений в контексте сеанса превысил бы ограничение в 1 МБ."
Last i = 2820
PS C:\Scripts>



Ключевой момент: Для повторяемости ошибки должен быть вызов обнуления контекстной переменной отдельной командой! Первичное присвоение значения на ошибку не влияет. В реальности переменные присваиваются в процедурах, многие из них не очищать не могу :(
Проверял на
<= SQL Server 2016 (SP1-CU6) (KB4037354) - 13.0.4457.0
и SQL Server 2017 (RTM) - 14.0.1000.169

Похоже есть какая-то утечка в SQL Server при обнулении сессионных переменных :( Может кто-то знает как обойти эту беду?
Диагностические запросы, наподобие
Код: sql
1.
SELECT * FROM sys.dm_os_memory_cache_counters WHERE type = 'CACHESTORE_SESSION_CONTEXT';

никаких утечек не показывают :(
...
Рейтинг: 0 / 0
04.12.2017, 14:23:36
    #39563713
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
https://connect.microsoft.com/SQLServer/feedback/details/3133017

Код: sql
1.
EXEC sys.sp_set_session_context N'context_debug', ''
...
Рейтинг: 0 / 0
04.12.2017, 14:42:00
    #39563737
Andret
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
Спасибо AlanDenton!

Пустые кавычки испробовал сразу, НО из-за того что критические переменные у меня типа datetimeoffset и int, то обнуление через КАВЫЧКИ не работает :(.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare	@context_debug datetimeoffset = SysDateTimeOffset(), @i int = 0
while	@i < 10000
begin
	set	@i+=1
	exec	sp_set_session_context N'context_debug', @context_debug;
	exec	sp_set_session_context N'context_debug', '';
end
print concat(@i, ' context_debug=', @context_debug)



Результат:10000 context_debug=2017-12-04 13:39:47.3968753 +02:00
...
Рейтинг: 0 / 0
04.12.2017, 14:44:30
    #39563741
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
Andret, а что мешает время кастовать к строке? Не спорю что костыль, но вариант рабочий.
...
Рейтинг: 0 / 0
04.12.2017, 15:01:26
    #39563766
Andret
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
AlanDenton,

Вы правы, придется что-то такое мутить:/
- несколько десятков процедур с логикой есть, плюс есть ещё своя автоматика, где теперь тип учитывать придётся ...
ломать совсем не охота :(
Думал, может что-то волшебное у
Код: c#
1.
SqlClient.SQLConnection/SqlCommand/...

найдётся;
перепробовал разные опции с Pool, MARS, .. но всё это как мёртвому припарка :-(
...
Рейтинг: 0 / 0
04.12.2017, 15:09:28
    #39563779
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
Andret, ничего хитрого не будет - самое лучшее решение ANSI строки в SESSION_CONTEXT хранить. Меньше проблем будет
...
Рейтинг: 0 / 0
04.12.2017, 15:16:11
    #39563788
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
AlanDentonAndret, ничего хитрого не будет - самое лучшее решение ANSI строки в SESSION_CONTEXT хранить. Меньше проблем будет+1

ЗЫ а почему не binary?
...
Рейтинг: 0 / 0
04.12.2017, 15:17:07
    #39563790
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ
Код: sql
1.
2.
3.
4.
5.
6.
DECLARE @context DATETIMEOFFSET = SYSDATETIMEOFFSET()

EXEC sp_set_session_context N'context', @context
EXEC sp_set_session_context N'context', ''

SELECT SESSION_CONTEXT(N'context'), NULLIF(CAST(SESSION_CONTEXT(N'context') AS DATETIMEOFFSET), '19000101')


легкий изврат, но все же...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Утечка памяти? #15665 Значение ключа "name" не было задано..превысил бы ограничение в 1 МБ / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]