|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Моделирую следующее поведение на своем тестовом приложении (Delphi, пробовал на компонентах IBX и UIB): 1. Стартую транзакцию (в моем случае Read Committed, Rec Version, Read Only, но похоже не важно) 2. Открываю любой простой SELECT запрос в клиентском приложении Код: pascal 1. 2.
3. Этот запрос появляется в MON$STATEMENTS 4. Затем я закрываю запрос и делаю Free для запроса в клиентском приложении Код: pascal 1. 2.
5. По исходникам компонент в режиме отладки видно, что вызывается isc_dsql_free_statement с параметром DSQL_DROP, что на мой взгляд должно приводить к полному закрытию запроса и освобождению всех связанных с ним ресурсов. 6. Но при этом запрос остается висеть в MON$STATEMENTS в состоянии MON$STATE = 0 7. Запрос пропадет из MON$STATEMENTS только после закрытия транзакции Хочу понять, насколько это правильное поведение и с чем оно связано? Например, при наличии долгой Read транзакции и периодического создания, выполнения, освобождения запросов в ней, они останутся висеть в MON$STATEMENTS, хотя по факту полностью закрыты на клиенте. И в связи с этим еще один вопрос: тратятся ли в данной ситуации ресурсы сервера на такие запросы, в каком объеме и насколько критично с точки зрения производительности? Версия Firebird и клиентских библиотек 2.5.4.26856 Windows x64 (SuperServer). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2015, 19:58 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Владимир АрхиповХочу понять, насколько это правильное поведение и с чем оно связано? Таблицы мониторинга это снапшот, они не изменяются после первого чтения. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2015, 20:06 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Владимир Архипов, не должно такого быть. Что-то где-то делается не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2015, 20:44 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
dimitrВладимир Архипов, не должно такого быть. Что-то где-то делается не так. Да это, наверное, lazy-mode. >насколько критично с точки зрения производительности? Если я все правильно забыл, то в клиентской либе есть (был) косяк с освобождением/очисткой массива отложенных операций/дескрипторов. Если элементов .... много, то будут спотыкания. Оно там удаляет первый элемент, а потом сдвигает хвост в начало. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 04:09 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
dimitrВладимир Архипов, не должно такого быть. Что-то где-то делается не так. Хочу уточнить, если допустить, что компоненты доступа (проверил несколько, поведение одинаковое) делают все правильно с точки зрения вызова функций клиентской библиотеки Firebird, то такое поведение неправильное и быть такого не должно, так? Если все-таки это какая-то специфика поведения Firebird, то, на мой взгляд, это неудобно с точки зрения анализа таблиц мониторинга. Я всегда предполагал, что IDLE запросы из MON$STATEMENTS - это незакрытые запросы, по которым нет никакой активности, а теперь получается, что полностью закрытые на клиенте запросы продолжают висеть MON$STATEMENTS с тем же статусом MON$STATE = 0 до закрытия транзакции? Коваленко ДмитрийДа это, наверное, lazy-mode. Что такое lazy-mode? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 12:06 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Владимир Архипов, снимок мониторинга создаётся в момент первого обращения к любой таблице мониторнига в текущей тр-ции и не меняется вплоть до окончания тр-ции. Поэтому можно закрывать запросы, делать дисконнект, бить в бубен - на снимок мониторинга это никак не повлияет до завершения той тр-ции, в которой этот снимок был сделан. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 12:24 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Коваленко ДмитрийЕсли я все правильно забыл, то в клиентской либе есть (был) косяк с освобождением/очисткой массива отложенных операций/дескрипторов. Если элементов .... много, то будут спотыкания. Оно там удаляет первый элемент, а потом сдвигает хвост в начало.И ты, конечно же, можешь об этом нам рассказать подробнее ? Или уже рассказывал, был послан не понят и гордо забил на это ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 12:26 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
Владимир Архипов, для начала надо бы рассказать, в какой именно транзакции запрашивается MON$STATEMENTS. Ибо о его снапшотности тут уже высказались неоднократно. во-вторых, после IBQuery1.Free() запрос умрет на сервере и исчезнет из MON$STATEMENTS (если ее правильно обновить). Но оный free может уйти с клиента серверу не мгновенно, а в момент следующего обращения. На этот (обычно короткий) период запрос будет висеть на сервере и быть виден в MON$STATEMENTS. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 12:31 |
|
Вызов isc_dsql_free_statement в режиме DSQL_DROP и видимость запросов в MON$STATEMENTS
|
|||
---|---|---|---|
#18+
dimitrВладимир Архипов, для начала надо бы рассказать, в какой именно транзакции запрашивается MON$STATEMENTS. Ибо о его снапшотности тут уже высказались неоднократно. во-вторых, после IBQuery1.Free() запрос умрет на сервере и исчезнет из MON$STATEMENTS (если ее правильно обновить). Но оный free может уйти с клиента серверу не мгновенно, а в момент следующего обращения. На этот (обычно короткий) период запрос будет висеть на сервере и быть виден в MON$STATEMENTS. Таблицу MON$STATEMENTS я смотрю в отдельном коннекте в отдельной транзакции. Для каждого просмотра MON$STATEMENTS я делаю рестарт транзакции, про "снапшотность MON$STATEMENTS" я знаю. dimitrНо оный free может уйти с клиента серверу не мгновенно, а в момент следующего обращения. Вот теперь я понял, не заметил сразу, спасибо. Это наверно было сделано для оптимизации сетевого взаимодействия между клиентом и сервером. Просто получается, например, что в случае долгой Read транзакции мы можем видеть висящий запрос с MON$STATE = 0, но на самом деле он может быть уже закрыт, просто после него пока ничего не делали и транзакцию тоже не закрывали. Но в целом это наверно уже мелочи... Вопрос закрыт, всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2015, 18:36 |
|
|
start [/forum/topic.php?fid=40&fpage=75&tid=1562780]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 191ms |
0 / 0 |