Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_Vasilisk_,

глянь пример Triggers.cpp

Там как раз эту особенность грамотно использовали. Соединение с внешней БД делается один раз и подготовливается запрос, в момент создания экземпляра триггера. А в методе execute подготовленный запрос просто многократно выполняют
10 июн 20, 15:34    [22148833]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11912
Симонов Денис
глянь пример Triggers.cpp
Глаза вытекают от макросов
Симонов Денис
Там как раз эту особенность грамотно использовали
Там внутри IExternalTrigger создается два поля
AutoRelease<IMessageMetadata> triggerMetadata;
AutoRelease<IStatement> stmt;
эти поля инициализируются в конструкторе, а потом используются в execute. Т.е. конкурентного доступа из разных потоков не планируется

Сообщение было отредактировано: 10 июн 20, 17:03
10 июн 20, 17:04    [22148887]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_Vasilisk_,

каких на фиг потоков? Я же писал что экземпляр процедуры/функции/триггера создаётся в момент загрузки в кеш метаданных. В трёшке он (кеш метаданных) раздельный для коннектов. Т.е в том примере экземпляр триггера, внешний коннект и препарированный запрос создаётся однократно в пределах текущей сессии. Но при каждом вызове триггера в текущей сессии подготовленный статмент используется повторно. Естественно, там нет никакого конкурентного доступа
10 июн 20, 17:30    [22148908]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11912
Симонов Денис
Естественно, там нет никакого конкурентного доступа
Т.е. идея
Другими словами, я могу безболезненно сохранить аргументы, передаваемые в IExternalProcedure.open в поля класса и безопасно к ним обращаться из любого места. А не передавать нужные мне параметры как аргументы в мои методы.
жизнеспособна и работающая?

И еще, могу я в IUdrProcedureFactory.newItem(), на основании переданного мне IExternalContext подготовить запросы к своей базе, чтобы потом в IExternalProcedure.open() просто вызвать IStatement.openCursor()?
10 июн 20, 17:57    [22148940]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_Vasilisk_
жизнеспособна и работающая?


нет. Процедура может вызываться многократно. Состояние процедуры при новом вызове, не должно зависеть от предыдущего.
Например если вздумается вызывать процедуру рекурсивно, то будет жопа.

_Vasilisk_
И еще, могу я в IUdrProcedureFactory.newItem(), на основании переданного мне IExternalContext подготовить запросы к своей базе, чтобы потом в IExternalProcedure.open() просто вызвать IStatement.openCursor()?


можешь. Вообще давно бы уже проверил
10 июн 20, 18:12    [22148947]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11912
Симонов Денис
вызывать процедуру рекурсивно,
Уговорил :)
10 июн 20, 18:57    [22148972]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Firebird, InterBase Ответить