Форум » LetoDB, HbNetio. » Leto DB Server (продолжение 8) » Ответить

Leto DB Server (продолжение 8)

Pasha: Немного доработал документацию к letodb

Ответов - 273, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All

Pasha: SergKis пишет: Еще можно добавить параметр .T./.F., что в skip буфере: записи с полями или ссылки на записи, участвующие в запросе и работать вместо skip через goto. Это как раз наоборот увеличит траффик. Если в skip-буфере хранятся записи, то они выбираются из него без обращения к серверу. Если номера записей (ссылки), то каждый goto потребует запроса к серверу, что нивелирует саму идею буфера.

SergKis: Pasha пишет:что нивелирует саму идею буфера Это как применять имеющиеся возможности. Если запрос к данным за несколько лет , т.е. для больших и неопределенных в объеме выборок, я бы предпочел быстро получить ссылки и потом работать по ним, а при работе с карточками, документами конечно skip-буфер. И что особенно нравится, не надо городить функции UDF, которые появившись, начинают жить вместе с проектом, но где то на сервере, и в общей куче, и хорошо если делал их сам. Функция Leto_ParseRecords() - это реальный вариант команды SELECT ... FROM ..., что радует. Pasha пишет: Тогда skip-буфер можно будет полноценно использовать при обновлении данных Наверно и эта возможность интересна, но как она будет сочетаться с транзакциями? Сегодня мы делаем так: - делаем выборку (select функция) - сохраняем в MemIO - даем для работы клиенту (Browse) - если были изменения, в транзакции сбрасываем на сервер как это будет выглядеть со skip буфером ?

Pasha: SergKis пишет: Это как применять имеющиеся возможности. Если запрос к данным за несколько лет , т.е. для больших и неопределенных в объеме выборок, я бы предпочел быстро получить ссылки и потом работать по ним, а при работе с карточками, документами конечно skip-буфер. И что особенно нравится, не надо городить функции UDF, которые появившись, начинают жить вместе с проектом, но где то на сервере, и в общей куче, и хорошо если делал их сам. Функция Leto_ParseRecords() - это реальный вариант команды SELECT ... FROM ..., что радует. Если установить фильтр: обычный и scope, то в skip-буфер как раз будут занесены только те записи, которые ему удовлетворяют, и нет необходимости в ссылках на номера записей с их дальнейшей выборкой Наверно и эта возможность интересна, но как она будет сочетаться с транзакциями? Смысл skip-буфера в том, чтобы прочитать с сервера сразу блок записей и затем его использовать без обращения к серверу. Как только запись изменяется, то skip-блок полностью очищается, и при обращении к следующей записи она будет вновь считана с сервера. Это относится к изменениям как в рамках транзации, так и без нее. Я при изменении записи хочу не очищать полностью skip-блок, а только помечать измененную запись в нем. Если потребуется выбрать запись, которая есть в буфере и не изменялась, то она будет выбрана из буфера, а если изменялась - считана вновь с сервера. Есть транзакция или нет - при этом роли не играет. К примеру, пусть в таблице 10 записей. Как сейчас обрабатывается выражение вида: go top while ! eof() if RLock() Field->FName := 'fsdfsdfsd' commit unlock endif skip enddo Сейчас: 1. Считано 10 записей в буфер, текущая запись номер 1 2. Запрос на update, буфер очищается 3. Skip - считывается 9 записей 4. Запрос на update, буфер очищается 5. Skip - считывается 8 записей ... Если изменить алгоритм: 1. Считано 10 записей в буфер, текущая запись номер 1 2. Запрос на update, буфер не очищается, в нем делается пометка для записи 1 3. Skip - берется следующая запись из буфера 4. Запрос на update, буфер не очищается, в нем делается пометка для записи 2 5. Skip - берется следующая запись из буфера ... Транзакция только влияет на то, как выполняется update: сразу или по commit transaction


SergKis: Pasha пишет:К примеру, пусть в таблице 10 записей. Как сейчас обрабатывается выражение вида go top while ! eof() ... Я правильно понял, что если написать на эти 10 записей Browse: go top Browse(...) и в функции пользователя при корректировке: if RLock() Field->FName := 'fsdfsdfsd' commit unlock endif ... Return REFRESH такая схема будет работать !

Pasha: Работать то будет, но неоптимально. До корректировки будет использоваться skip-буфер. При корректировке он будет очищен, и вся страница browse опять будет считана с сервера. Я хочу сделать, чтобы буфер полностью не очищался, а считывалась только измененная запись при повторном обращении к ней.

SergKis: Pasha спасибо за объяснения !!!

SergKis: Паша, еще вопрос по skip-буферу. Сейчас некоторые справочники читаю в массивы и потом, работаю по AScan(...), со skip-буфером можно ли делать так: select AAA; leto_SetSeekBufer(LastRec()); leto_ParseRecords(...) // справочник 1 select BBB; leto_SetSeekBufer(LastRec()); leto_ParseRecords(...) // справочник 2 потом, по надобности делать: select AAA; LOCATE ... select BBB; LOCATE ... или skip-буфер один, а не для каждой области ?

Pasha: skip-буфер создается для каждой рабочей области, а seek-буфер - для каждого индекса рабочей области. Но по умолчанию seek-буфер не создается, его надо задать. Но это разные буфера, один для операции skip, второй - для seek leto_ParseRecords заполняет именно skip-буфер, к seek-буферу он не имеет отношения. Если locate хочется использовать данных skip-буфера, полученных после leto_ParseRecords, то так просто это не сделаешь. locate первым делом сделает go top, что сразу сбросит skip-буфер и испортит весь кайф. Поэтому надо делать locate с опцией rest В результате locate переместится на найденную запись или на eof, если запись не найдена, и последующий locate в этом skip-буфере без его сброса будет сделать затруднительно. Поэтому предпочтительнее все-таки будет алгоритм с просмотром всего полученного skip-буфера сразу: while ! eof() и в цикле делать все нужные сравнения skip enddo все равно этот skip буфер уже получен с сервера и находится на клиенте.

SergKis: Pasha пишет:все равно этот skip буфер уже получен с сервера и находится на клиенте Это все очень ЗДОРОВО ! Тогда вместо memio можно использовать следующее: select DOKUM; leto_SetSkipBufer(100); leto_ParseRecords(...) while ! eof() RLock() skip enddo Browse(...) // с корректировкой если изменения были в нескольких RecNo, то while ! eof() commit skip enddo Unlock() Как в таком случае быть с dbAppend() ?

Pasha: leto_SetSkipBufer(100) перед leto_ParseRecords(...) делать необязательно, так как в буфер заносятся все данные, удовлетворяющие заданному условию. После всех операций изменения данных сейчас буфер сбрасывается. Я только собираюсь сделать другой алгоритм: не сброс буфера, а пометку в нем измененных записей, но еще это не сделал.

Pasha: Я так понимаю, вы хотите сделать что-то вроде аналога fetch для результатов sql-запроса. Я думаю, может стоит сделать отдельный набор функций для навигации по skip-буферу: текущая позиция в буфере, перемещение вперед/назад Но это вопрос дискуссинный. Может достаточно будет обойтись функцией, которая бы возвращала позицию текущей записи в буфере.

SergKis: Pasha пишет:Я так понимаю, вы хотите сделать что-то вроде аналога fetch для результатов sql-запроса Как конечный результат - да, а как промежуточный - избавится от кода закачки справочников в массивы и работа с документами, карточками со skip-буфером вместо закачки в memio, т.е. значительно сократить код в программе. Я думаю, может стоит сделать отдельный набор функций для навигации по skip-буферу это не принципиально, если будет какой-то базовый набор функций - обвесить можно всегда.

Andrey: sashaBG пишет: Привет Всем кто использует LetoDB ! Сервер LetoDB работает отлично ! sashaBG пишет: Кстати в letodbtray но для моего проекта е сделал исправление : потому что Letodb падает из за постоянного подключение и отключения я в цикле по таймеру сделал възов функцию IsAlive() вместо IsConnected(): FUNCTION IsAlive() Return leto_file( _Server+"USER.DBF" ) и таким образом серввер не падает. но для общего использования она не подойдет , нельзя ли сделать на C leto_islive() ? И еще интересное наблюдение : на серверах ( я пробую на windows Serwer 2008 ) скорость работы letodb заметно ниже чем на обычном XP процессор на сервере нагружается небольше 5% а под XP и Win7 доходит до 60% и больше , наверное ето потому что letodb не серверный процесс. Как решились эти проблемы ? Есть ли новая версия letodbtray ? Если можно, то поделитесь пожалуйста. В вашей предыдущей программе не хватает информации по Номеру версии (сборки) LetoDB и и заодно и Номера версии вашей программы. Я так понял Вы пишите программы с LetoDB на МиниГуи. Как МиниГуи работает с базами, какие тонкости есть при использовании МиниГуи ?

sashaBG: Андрей прошло много времени с того поста что в цитате , сервер сайчас работает намного лучше. Когда у меня будет болше времени , обещаю сделать небольшой пример СЕРВЕРА(комбинация между letodb + HBNETIO + MiniGUI) и КЛИЕНТА(MiniGUI + rddleto) В принципе нет большой разницы при работе letodb чем с другими RDD . Я постараюсь показать кое чего в примере :)

Andrey: sashaBG пишет: Я постараюсь показать кое чего в примере :) Заранее спасибо, буду ждать. С наступающим Новым Годом !

Andrey: Что-то не хочет запускаться letodb.exe на Win8 (32bit) из под администратора. Версия letodb-2.09-win, пробовал из папки Bin\BCC и Bin\MinGW D:\@TEST_LETODB\letodb.log 12/29/12 02:14:16: Error installing LetoDB service: 5 12/29/12 02:18:20: LetoDB service has had some problems: 1063 12/29/12 02:20:20: LetoDB service has had some problems: 1063 12/29/12 02:22:11: LetoDB service has had some problems: 1063 12/30/12 12:00:11: LetoDB service has had some problems: 1063 12/30/12 12:01:53: LetoDB service has had some problems: 1063 Старая версия letodb.exe (672256) 14.06.10 - запускается. 12/30/12 12:04:34: Leto DB Server has been started.

sashaBG: Ето потому что сервер откомпилирован как (SERVICE) сначало сделай letodb install , потом в срвисах найди запусти и (SERVICE) LetoDB Service после етого даже после рестарта компьютера служба будет работать я тоже на WIN8 почитай readme_rus.txt там все написано :) потом из командной строки или из программы можно останавливать и запускать net start "LetoDB Service" - СТАРТ net stop "LetoDB Service" - СТОП

Andrey: sashaBG пишет: сначало сделай letodb install Да читал я доку: Для установки и удаления службы необходимы права администратора. Для установки службы вызовите letodb с параметром 'install': letodb.exe install Делаю, пишет вот это: 12/30/12 21:54:00: Error installing LetoDB service: 5

Pasha: Andrey пишет: Делаю, пишет вот это: 12/30/12 21:54:00: Error installing LetoDB service: 5 Ошибка 5 - это ERROR_ACCESS_DENIED, что однозначно идентифицирует причину ошибки как недостаток прав доступа для установки службы. Убедитесь, что есть права админа. В конце концов, создайте ярлык на "letodb install" и запустите его с правами администратора, если такое возможно под win8

Andrey: Pasha пишет: В конце концов, создайте ярлык на "letodb install" и запустите его с правами администратора, если такое возможно под win8 Спасибо БОЛЬШОЕ !



полная версия страницы