Ты вроде как в свое время на медленных линиях собаку съел... :) Может
вспомишь чего...
Я не кореец, аднака, собак не ем :)
Ну зато пиво наверняка пьешь. Так что с меня причитается при певой же
возможности... :)))
Terminal Server попроще будет, потому его и посоветовал сходу :)
Ну, раз не хочешь попроще - лови посложнее :)
Вспомнилось:
Эй Вася, лови молоток... Чего молчишь-то? Не поймал чтоли? :)
Самое простое, что можно сделать с IBX, по-памяти
а) убрать никому не нужный isc_dsql_set_cursor_name
Ну не нужен и фиг с им. Выкину. Ломать - не строить.
б) сделать хендлы запросов повторно используемыми, т.е.
не вызывать isc_dsql_free_statement(..., DSQL_drop), а засовывать хендл
за щёку. Вынимать из-за щеки когда оно зовёт
isc_dsql_allocate_statement.
Ок. Это чуть посложнее, но вполне осуществимо. А на сервере по
allocate_statement какие-то ресурсы выделяются? При такой схеме по идее их
больше отжираться будет. Или это мелочи, на которые можно не обращать
внимания?
в) в TIBSQL.GetRowsAffected сделать буфер правильного р-ра (32 байта),
а не 1048 (откуда он взял это число ???). Или ваще похерить этот
вызов, если конечно можешь без него обойтись.
В большинстве случаев могу. Вообщем сделаю какую-нибудь проперть, которая
будет включать/выключать этот вызов. Ну и размер буфера, конечно поправлю.
г) в TIBSQL.Prepare заменить
if FSQLType in [SQLSelect, SQLSelectForUpdate,
SQLExecProcedure] then
begin
{ Allocate an initial output descriptor (with one column) }
- FSQLRecord.Count := 1;
+ if FSQLRecord.FSize = 0
+ then FSQLRecord.Count := 1; // тут можно любое число > 0
{ Using isc_dsql_describe, get the right size for the
columns... }
Call(FGDSLibrary.isc_dsql_describe(StatusVector, @FHandle,
Database.SQLDialect, FSQLRecord.FXSQLDA), True);
if FSQLRecord.FXSQLDA^.sqld > FSQLRecord.FXSQLDA^.sqln then
begin
- FSQLRecord.Count := FSQLRecord.FXSQLDA^.sqld;
Call(FGDSLibrary.isc_dsql_describe(StatusVector, @FHandle,
Database.SQLDialect, FSQLRecord.FXSQLDA), True);
end
- else
- if FSQLRecord.FXSQLDA^.sqld = 0 then
- FSQLRecord.Count := 0;
+ FSQLRecord.Count := FSQLRecord.FXSQLDA^.sqld;
Это я сам не пробовал, но должно работать.
Суть - не вызывать isc_dsql_describe второй раз, если у нас
и так хватает дескрипторов (XSQLDA) для резалтсета
Будем попробовать...
д) Выключить trace флаги у TIBDatabase и\или выключить запрос плана в
TIBSQLMonitorHook.SQLPrepare
Ок. Вообщем-то trace флаги у меня выключены.
Спасибо. Самому бы это копать и копать... Вообщем точно, с меня пиво.
PS Можно так же пользовать FB 2.1 в котором часть вышенаписанного уже есть
плюс кое-что ещё :)
Я так понимаю, что IBX править придется, чтобы добраться до этого "кое-что
еще" :) ? Да и вообще,кстати, IBX будет работать с 2.1 без доводки
напильником?
PPS эээх, столько "секретов" выдал :)
Я знал, что ты добрый :)))
With b/r. Gleb.