Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по prepared запросам / 25 сообщений из 47, страница 1 из 2
27.07.2015, 10:56
    #39016461
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Всем здравствуйте. Ткните носом если этот вопрос уже обсуждался.

Картина следующая - имеется Firebird 2.5 в архитектуре CS и приложение из пары окон ввода данных. Все пишущие транзации короткие - стартуют вручную и завершаются жестким коммитом. Читающая транзация стартует в состоянии pre-commited. И вроде бы все хорошо, но в MON$STATEMENTS регулярно остаются записи я так понимаю подготовленных запросов вот такого вида:


В приложении эта инструкция выполняется компонентой IBSQL. Если после ExecSQL выполнить Unprepare, то запись в MON$STATEMENTS не остается. Непонятно почему сохраняются только некоторые из таких инструкций - все они одинкаово формируются, все параметризированны, все выполняются по одной схеме - старт транзации - выполнение инструкции - коммит. Получается что для некоторых курсор освебождается автоматически, а для некоторых только после уничтожения коннекта?
...
Рейтинг: 0 / 0
27.07.2015, 11:52
    #39016557
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxaПолучается что для некоторых курсор освебождается автоматически, а для
некоторых только после уничтожения коннекта?
Препарированный запрос принадлежит коннекту, а не транзакции. И без явного его
освобождения всегда освобождается только с концом коннекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2015, 12:38
    #39016614
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Но почему тогда я вижу только некоторые? Явного освобождения не делаю нигде
...
Рейтинг: 0 / 0
27.07.2015, 12:46
    #39016631
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxaНо почему тогда я вижу только некоторые? Явного освобождения не делаю нигде

Значит, твоя программа работает совсем не так как ты о ней думаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2015, 13:14
    #39016684
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Dimitry SibiryakovЗначит, твоя программа работает совсем не так как ты о ней думаешь.

Спасибо
....
У меня-то формы уничтожаются по закрытию, а раз так - то вызывается деструктор TIBSQL, а раз вызывается - значит выполняется Unprepared в InternalFreeHandle. Вот и все объяснение.
...
Рейтинг: 0 / 0
27.07.2015, 23:39
    #39017207
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Я тут подумала немножко и у меня назрело еще вопросов.

Если выполнять запрос в isql то после коммита подготовленные запросы исчезают. Хотя соединение остается активным. То же касается выполнения запросов в IBExpert. При коммите из клиентского приложения подготовленный запрос сохраняется либо до уничтожения компонента, связаного с ним, либо до разрыва соединения.

Я так понимаю что освобождение происходит при вызове isc_dsql_free_statement. По крайней мере судя по наблюдению в SQL мониторе. В трекере FB есть ссылка где разработчики говорят о том что в версии 2.5 добавлена специальная константа DSQL_unprepare, которая позволяет не только уничтожить сам дескриптор стэйтмента, но и сделать SQL инструкцию unprepared. Поковырявшись в исходниках IBX TIBSQL.pas (у меня версия 16.16 Delphi XE2) я не обнаружила нигде передачи этого параметра в вызов isc_dsql_free_statement. Только DSQL_close или DSQL_drop, причем передача DSQL_drop выполняется только в деструкторе и соответственно если явно не вызывать метод Unprepare - то это и даст наблюдаемую мной картину.

Так что я подозреваю что при работе isql и IBExpert вызывают isc_dsql_free_statement(DSQL_close|DSQL_unprepare) или isc_dsql_free_statement(DSQL_drop|DSQL_unprepare) что позволяет сразу освободить подготовленные запросы, в то время как IBX выполняет isc_dsql_free_statement(DSQL_close) и isc_dsql_free_statement(DSQL_drop).

Хотелось бы понять в правильную сторону ли я думаю?
...
Рейтинг: 0 / 0
27.07.2015, 23:45
    #39017210
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa,

в IBE компоненты доступа сильно допилены
...
Рейтинг: 0 / 0
27.07.2015, 23:55
    #39017213
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
На сегодяшний момент это лучший из бесплатных вариантов. Я особых претензий не высказываю им - просто хочу понимать - правильно ли я понимаю как это работает?
...
Рейтинг: 0 / 0
27.07.2015, 23:55
    #39017214
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa> Хотелось бы понять в правильную сторону ли я думаю?

Надо уметь задавать правильные вопросы.
Правильный вопрос в данном случае -
нахера оно тебе? Задай тот вопрос или
озвучь ту проблему, от которой исходила.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2015, 23:56
    #39017215
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa,

isql не использует DSQL_unprepare. И я сильно сомневаюсь, что IBE его использует.

В чём проблема-то ? Вызвать Unprepare сложно\не хочется ? А зачем ?
...
Рейтинг: 0 / 0
27.07.2015, 23:57
    #39017217
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Гаджимурадов Рустам, вопрос в том почему при выполнении запросов через IBExpert и isql подготовленные запросы освобождаются, а при работе через IBX - без явного Unprepare - нет? Собственно и все получается
...
Рейтинг: 0 / 0
27.07.2015, 23:59
    #39017218
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
hvlad, не сложно конечно. Весь мучающий меня вопрос в 17942742
...
Рейтинг: 0 / 0
28.07.2015, 00:03
    #39017220
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxahvlad, не сложно конечно. Весь мучающий меня вопрос в 17942742
Футы.. на ночь глядя уже не то пишу. Вопрос в 17942752
...
Рейтинг: 0 / 0
28.07.2015, 00:11
    #39017224
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa,

isql выполняет запросы, используя один и тот же хендл запроса.
Соответственно, если не делать commit\rollback, то в мониторинге должен быть виден последний выполнявшийся запрос.
Если выполнить commit\rollback, то isql его тоже выполняет с помощью isc_dsql_execute (а не isc_commit\rollback). Используя всё тот же хендл запроса.
Соответственно, предыдущий запрос уничтожается сервером (в момент prepare нового запроса commit\rollback), а нового "запроса" в мониторинге не видно т.к. у таких запросов нет "тела"
которое движок может выполнить и он о них "не знает" (на самом деле там кухня с запросами чуть
сложнее)
...
Рейтинг: 0 / 0
28.07.2015, 00:19
    #39017228
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Вот оно что. Спасибо большое за ответ. Я и не знала что isc_dsql_execute может так использоваться. В моем представлении сначала должен быть isc_dsql_execute ..... и потом в конце isc_commit_transaction
...
Рейтинг: 0 / 0
28.07.2015, 00:22
    #39017231
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa> Я и не знала что isc_dsql_execute может так использоваться

Это тараканы isql. IBE (кроме скриптера) так не работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.07.2015, 00:22
    #39017232
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
А еще совсем глупый вопрос - очень ли плохо если этих запросов много кэшируется? Например для одного коннекта их может быть 80-90 шт. А соединений таких около полусотни. Влияет ли это как-то на работу базы?
...
Рейтинг: 0 / 0
28.07.2015, 00:23
    #39017235
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa> для одного коннекта их может быть 80-90 шт.
tanyxa> А соединений таких около полусотни.
tanyxa> Влияет ли это как-то на работу базы?

Господи, девушка, не смешите людей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.07.2015, 00:27
    #39017237
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Гаджимурадов Рустамtanyxa> Я и не знала что isc_dsql_execute может так использоваться

Это тараканы isql. IBE (кроме скриптера) так не работает.

Но ведет себя похоже ))) Наверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepare
...
Рейтинг: 0 / 0
28.07.2015, 00:30
    #39017238
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
Гаджимурадов Рустамtanyxa> для одного коннекта их может быть 80-90 шт.
tanyxa> А соединений таких около полусотни.
tanyxa> Влияет ли это как-то на работу базы?

Господи, девушка, не смешите людей.

Я постараюсь :)
...
Рейтинг: 0 / 0
28.07.2015, 00:33
    #39017240
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxaочень ли плохо если этих запросов много кэшируется?Они жрут память.
...
Рейтинг: 0 / 0
28.07.2015, 00:34
    #39017241
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxaНаверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepareДля того, чтобы сделать prepare, не нужно делать DSQL_drop.
...
Рейтинг: 0 / 0
28.07.2015, 00:42
    #39017243
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
hvladtanyxaочень ли плохо если этих запросов много кэшируется?Они жрут память.
Я думала что если сам запрос уже выполнен, значит клиент уже получил запрошенные данные и это не более чем сохраненный текст в метаданных
...
Рейтинг: 0 / 0
28.07.2015, 00:43
    #39017244
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
tanyxa> Но ведет себя похоже

Да, пожалуй. Но не в части обработки commit и т.п.
Т.е., IIRC, IBE их честно и корректно обрабатывает,
но идиотов, которые так используют IBE я не знаю
(хотя не удивлюсь). А вот при коммите он честно
освобождает ненужные запросы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.07.2015, 00:44
    #39017245
tanyxa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по prepared запросам
hvladtanyxaНаверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepareДля того, чтобы сделать prepare, не нужно делать DSQL_drop.
Извините, может косноязычно выражаюсь - я говорю о том что при выполнении запроса и последующего коммита - подготовленый запрос освобождается.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по prepared запросам / 25 сообщений из 47, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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