|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Всем здравствуйте. Ткните носом если этот вопрос уже обсуждался. Картина следующая - имеется Firebird 2.5 в архитектуре CS и приложение из пары окон ввода данных. Все пишущие транзации короткие - стартуют вручную и завершаются жестким коммитом. Читающая транзация стартует в состоянии pre-commited. И вроде бы все хорошо, но в MON$STATEMENTS регулярно остаются записи я так понимаю подготовленных запросов вот такого вида: В приложении эта инструкция выполняется компонентой IBSQL. Если после ExecSQL выполнить Unprepare, то запись в MON$STATEMENTS не остается. Непонятно почему сохраняются только некоторые из таких инструкций - все они одинкаово формируются, все параметризированны, все выполняются по одной схеме - старт транзации - выполнение инструкции - коммит. Получается что для некоторых курсор освебождается автоматически, а для некоторых только после уничтожения коннекта? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 10:56 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxaПолучается что для некоторых курсор освебождается автоматически, а для некоторых только после уничтожения коннекта? Препарированный запрос принадлежит коннекту, а не транзакции. И без явного его освобождения всегда освобождается только с концом коннекта. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 11:52 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Но почему тогда я вижу только некоторые? Явного освобождения не делаю нигде ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 12:38 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxaНо почему тогда я вижу только некоторые? Явного освобождения не делаю нигде Значит, твоя программа работает совсем не так как ты о ней думаешь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 12:46 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЗначит, твоя программа работает совсем не так как ты о ней думаешь. Спасибо .... У меня-то формы уничтожаются по закрытию, а раз так - то вызывается деструктор TIBSQL, а раз вызывается - значит выполняется Unprepared в InternalFreeHandle. Вот и все объяснение. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 13:14 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Я тут подумала немножко и у меня назрело еще вопросов. Если выполнять запрос в 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). Хотелось бы понять в правильную сторону ли я думаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:39 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa, в IBE компоненты доступа сильно допилены ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:45 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
На сегодяшний момент это лучший из бесплатных вариантов. Я особых претензий не высказываю им - просто хочу понимать - правильно ли я понимаю как это работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:55 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa> Хотелось бы понять в правильную сторону ли я думаю? Надо уметь задавать правильные вопросы. Правильный вопрос в данном случае - нахера оно тебе? Задай тот вопрос или озвучь ту проблему, от которой исходила. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:55 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa, isql не использует DSQL_unprepare. И я сильно сомневаюсь, что IBE его использует. В чём проблема-то ? Вызвать Unprepare сложно\не хочется ? А зачем ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:56 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, вопрос в том почему при выполнении запросов через IBExpert и isql подготовленные запросы освобождаются, а при работе через IBX - без явного Unprepare - нет? Собственно и все получается ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:57 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
hvlad, не сложно конечно. Весь мучающий меня вопрос в 17942742 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2015, 23:59 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxahvlad, не сложно конечно. Весь мучающий меня вопрос в 17942742 Футы.. на ночь глядя уже не то пишу. Вопрос в 17942752 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:03 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa, isql выполняет запросы, используя один и тот же хендл запроса. Соответственно, если не делать commit\rollback, то в мониторинге должен быть виден последний выполнявшийся запрос. Если выполнить commit\rollback, то isql его тоже выполняет с помощью isc_dsql_execute (а не isc_commit\rollback). Используя всё тот же хендл запроса. Соответственно, предыдущий запрос уничтожается сервером (в момент prepare нового запроса commit\rollback), а нового "запроса" в мониторинге не видно т.к. у таких запросов нет "тела" которое движок может выполнить и он о них "не знает" (на самом деле там кухня с запросами чуть сложнее) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:11 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Вот оно что. Спасибо большое за ответ. Я и не знала что isc_dsql_execute может так использоваться. В моем представлении сначала должен быть isc_dsql_execute ..... и потом в конце isc_commit_transaction ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:19 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa> Я и не знала что isc_dsql_execute может так использоваться Это тараканы isql. IBE (кроме скриптера) так не работает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:22 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
А еще совсем глупый вопрос - очень ли плохо если этих запросов много кэшируется? Например для одного коннекта их может быть 80-90 шт. А соединений таких около полусотни. Влияет ли это как-то на работу базы? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:22 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa> для одного коннекта их может быть 80-90 шт. tanyxa> А соединений таких около полусотни. tanyxa> Влияет ли это как-то на работу базы? Господи, девушка, не смешите людей. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:23 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамtanyxa> Я и не знала что isc_dsql_execute может так использоваться Это тараканы isql. IBE (кроме скриптера) так не работает. Но ведет себя похоже ))) Наверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepare ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:27 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамtanyxa> для одного коннекта их может быть 80-90 шт. tanyxa> А соединений таких около полусотни. tanyxa> Влияет ли это как-то на работу базы? Господи, девушка, не смешите людей. Я постараюсь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:30 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxaочень ли плохо если этих запросов много кэшируется?Они жрут память. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:33 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxaНаверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepareДля того, чтобы сделать prepare, не нужно делать DSQL_drop. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:34 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
hvladtanyxaочень ли плохо если этих запросов много кэшируется?Они жрут память. Я думала что если сам запрос уже выполнен, значит клиент уже получил запрошенные данные и это не более чем сохраненный текст в метаданных ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:42 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
tanyxa> Но ведет себя похоже Да, пожалуй. Но не в части обработки commit и т.п. Т.е., IIRC, IBE их честно и корректно обрабатывает, но идиотов, которые так используют IBE я не знаю (хотя не удивлюсь). А вот при коммите он честно освобождает ненужные запросы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:43 |
|
Вопрос по prepared запросам
|
|||
---|---|---|---|
#18+
hvladtanyxaНаверное использует DSQL_drop, судя по тому что каждый раз при выполнении запроса заново делает prepareДля того, чтобы сделать prepare, не нужно делать DSQL_drop. Извините, может косноязычно выражаюсь - я говорю о том что при выполнении запроса и последующего коммита - подготовленый запрос освобождается. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2015, 00:44 |
|
|
start [/forum/topic.php?fid=40&msg=39017220&tid=1562695]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 158ms |
0 / 0 |