Автор | Сообщение |
Pasha
|
| Администратор
|
Пост N: 2416
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.06.12 18:14. Заголовок: Leto DB Server (продолжение 8)
Немного доработал документацию к letodb
|
|
|
Ответов - 273
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
All
[только новые]
|
|
Pasha
|
| Администратор
|
Пост N: 2636
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.12.12 14:13. Заголовок: SergKis пишет: Еще ..
SergKis пишет: цитата: | Еще можно добавить параметр .T./.F., что в skip буфере: записи с полями или ссылки на записи, участвующие в запросе и работать вместо skip через goto. |
| Это как раз наоборот увеличит траффик. Если в skip-буфере хранятся записи, то они выбираются из него без обращения к серверу. Если номера записей (ссылки), то каждый goto потребует запроса к серверу, что нивелирует саму идею буфера.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 57
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.12.12 15:26. Заголовок: Pasha пишет:что ниве..
Pasha пишет: цитата: | что нивелирует саму идею буфера |
|
Это как применять имеющиеся возможности. Если запрос к данным за несколько лет , т.е. для больших и неопределенных в объеме выборок, я бы предпочел быстро получить ссылки и потом работать по ним, а при работе с карточками, документами конечно skip-буфер. И что особенно нравится, не надо городить функции UDF, которые появившись, начинают жить вместе с проектом, но где то на сервере, и в общей куче, и хорошо если делал их сам. Функция Leto_ParseRecords() - это реальный вариант команды SELECT ... FROM ..., что радует. Pasha пишет: цитата: | Тогда skip-буфер можно будет полноценно использовать при обновлении данных |
| Наверно и эта возможность интересна, но как она будет сочетаться с транзакциями? Сегодня мы делаем так: - делаем выборку (select функция) - сохраняем в MemIO - даем для работы клиенту (Browse) - если были изменения, в транзакции сбрасываем на сервер как это будет выглядеть со skip буфером ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 2638
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.12.12 15:47. Заголовок: SergKis пишет: Это ..
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
|
| постоянный участник
|
Пост N: 59
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.12.12 16:16. Заголовок: Pasha пишет:К пример..
Pasha пишет: цитата: | К примеру, пусть в таблице 10 записей. Как сейчас обрабатывается выражение вида go top while ! eof() ... |
| Я правильно понял, что если написать на эти 10 записей Browse: go top Browse(...) и в функции пользователя при корректировке: if RLock() Field->FName := 'fsdfsdfsd' commit unlock endif ... Return REFRESH такая схема будет работать !
|
|
|
Pasha
|
| Администратор
|
Пост N: 2640
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.12.12 16:20. Заголовок: Работать то будет, н..
Работать то будет, но неоптимально. До корректировки будет использоваться skip-буфер. При корректировке он будет очищен, и вся страница browse опять будет считана с сервера. Я хочу сделать, чтобы буфер полностью не очищался, а считывалась только измененная запись при повторном обращении к ней.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 61
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.12.12 16:37. Заголовок: Pasha спасибо за объ..
Pasha спасибо за объяснения !!!
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 62
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.12.12 09:22. Заголовок: Паша, еще вопрос по ..
Паша, еще вопрос по 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
|
| Администратор
|
Пост N: 2642
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.12 10:27. Заголовок: skip-буфер создается..
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
|
| постоянный участник
|
Пост N: 64
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.12.12 10:46. Заголовок: Pasha пишет:все равн..
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
|
| Администратор
|
Пост N: 2643
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.12 11:04. Заголовок: leto_SetSkipBufer(1..
leto_SetSkipBufer(100) перед leto_ParseRecords(...) делать необязательно, так как в буфер заносятся все данные, удовлетворяющие заданному условию. После всех операций изменения данных сейчас буфер сбрасывается. Я только собираюсь сделать другой алгоритм: не сброс буфера, а пометку в нем измененных записей, но еще это не сделал.
|
|
|
Pasha
|
| Администратор
|
Пост N: 2644
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.12 11:06. Заголовок: Я так понимаю, вы хо..
Я так понимаю, вы хотите сделать что-то вроде аналога fetch для результатов sql-запроса. Я думаю, может стоит сделать отдельный набор функций для навигации по skip-буферу: текущая позиция в буфере, перемещение вперед/назад Но это вопрос дискуссинный. Может достаточно будет обойтись функцией, которая бы возвращала позицию текущей записи в буфере.
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 66
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.12.12 11:31. Заголовок: Pasha пишет:Я так по..
Pasha пишет: цитата: | Я так понимаю, вы хотите сделать что-то вроде аналога fetch для результатов sql-запроса |
|
Как конечный результат - да, а как промежуточный - избавится от кода закачки справочников в массивы и работа с документами, карточками со skip-буфером вместо закачки в memio, т.е. значительно сократить код в программе. цитата: | Я думаю, может стоит сделать отдельный набор функций для навигации по skip-буферу |
|
это не принципиально, если будет какой-то базовый набор функций - обвесить можно всегда.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2523
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.12.12 00:57. Заголовок: sashaBG пишет: Прив..
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
|
| постоянный участник
|
Пост N: 117
Зарегистрирован: 15.09.05
|
|
Отправлено: 29.12.12 12:16. Заголовок: Привет
Андрей прошло много времени с того поста что в цитате , сервер сайчас работает намного лучше. Когда у меня будет болше времени , обещаю сделать небольшой пример СЕРВЕРА(комбинация между letodb + HBNETIO + MiniGUI) и КЛИЕНТА(MiniGUI + rddleto) В принципе нет большой разницы при работе letodb чем с другими RDD . Я постараюсь показать кое чего в примере :)
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2524
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.12.12 18:54. Заголовок: sashaBG пишет: Я по..
sashaBG пишет: цитата: | Я постараюсь показать кое чего в примере :) |
| Заранее спасибо, буду ждать. С наступающим Новым Годом !
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2525
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.12.12 11:06. Заголовок: Что-то не хочет запу..
Что-то не хочет запускаться 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
|
| постоянный участник
|
Пост N: 118
Зарегистрирован: 15.09.05
|
|
Отправлено: 30.12.12 16:46. Заголовок: Ето потому что сервер откомпилирован как (SERVICE)
Ето потому что сервер откомпилирован как (SERVICE) сначало сделай letodb install , потом в срвисах найди запусти и (SERVICE) LetoDB Service после етого даже после рестарта компьютера служба будет работать я тоже на WIN8 почитай readme_rus.txt там все написано :) потом из командной строки или из программы можно останавливать и запускать net start "LetoDB Service" - СТАРТ net stop "LetoDB Service" - СТОП
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2526
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.12.12 20:54. Заголовок: sashaBG пишет: снач..
sashaBG пишет: цитата: | сначало сделай letodb install |
| Да читал я доку: Для установки и удаления службы необходимы права администратора. Для установки службы вызовите letodb с параметром 'install': letodb.exe install Делаю, пишет вот это: 12/30/12 21:54:00: Error installing LetoDB service: 5
|
|
|
Pasha
|
| Администратор
|
Пост N: 2647
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.12.12 21:17. Заголовок: Andrey пишет: Делаю..
Andrey пишет: цитата: | Делаю, пишет вот это: 12/30/12 21:54:00: Error installing LetoDB service: 5 |
| Ошибка 5 - это ERROR_ACCESS_DENIED, что однозначно идентифицирует причину ошибки как недостаток прав доступа для установки службы. Убедитесь, что есть права админа. В конце концов, создайте ярлык на "letodb install" и запустите его с правами администратора, если такое возможно под win8
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2527
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.12.12 23:20. Заголовок: Pasha пишет: В кон..
Pasha пишет: цитата: | В конце концов, создайте ярлык на "letodb install" и запустите его с правами администратора, если такое возможно под win8 |
| Спасибо БОЛЬШОЕ !
|
|
|
Ответов - 273
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
All
[только новые]
|
|