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

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

alkresin: Только что открыл на Sourceforge новый проект - Leto DB Server - https://sourceforge.net/projects/letodb Это мультиплатформенный ( Windows, Unix/Linux ) сервер баз данных, предоставляющий клиентским программам доступ к dbf/cdx файлам, находящимся на удаленном сервере ( можно и на локальном компьютере запускать - в отладочных целях ). В общем, как ADS :). Проект - на стадии разработки, не все даже базовые функции еще реализованы, до оптимизации дело еще не дошло. Но работает :). Крутится у меня на сервере несколько дней, подключал до 15 клиентов, пока не падает. Мои программы работают с ним нормально. Преимущества по сравнению с обычным файл-сервером: 1) Безопасность - базы могут быть в каталоге, недоступном для клиентских компьютеров - никто их случайно не удалит и не повредит. 2) Поскольку базы открываются серверной программой, а не клиентской, ее целостности ничего не грозит при случайном отключении клиентского компьютера. 3) значительное уменьшение сетевого траффика. 4) Должен быть, по идее, выигрыш в скорости. 5) Возможность контроля за пользователями с помощью утилиты manage ( можно придумать и другие формы контроля ). 6) Можно будет сделать транзакции, stored procedures на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.

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

AlexMyr: Dimka пишет: пытаюсь начать пользоваться letodb. на одном большом рассчете программка начинает течь и занимает 1гб оперативы Попробуйте сделать маленький самодостаточный пример и на нем потестировать, и если будут проблемы, тогда пример в студию.

Dimka: Использование letodb нарушило логику программы и она входила в бесконечный цикл. SET EXACT OFF не включало мягкий поиск как раньше и DBSEEK возвращал False. Вызов DBSEEK со вторым параметром решил проблему. Еще, повторю, после использования команды USE с открытием нескольких индексов активный индекс по умолчанию - последний, вместо первого. UPD. SET EXACT OFF включает мягкий поиск, но он то ли слетает, то ли неправильно работает. dbseek выдает False там где должен выдавать True.

Pasha: Dimka пишет: SET EXACT OFF не включало мягкий поиск как раньше и DBSEEK возвращал False. Вообще-то set exact предназначен для другого - для сравнения строк, и не имеет отношения ни к letodb, ни к подсистеме rdd вообще Может быть, имеется в виду set softseek ? Так он обрабатывается еще на уровне функции dbSeek, и letodb получает уже готовый параметр, и сам не должен учитывать эту настройку


Dimka: Ыыыыы...точняк! Я еще поэкспериментирую, но факт остается фактом. Один и тот же код при DBFNTX и LETO(NTX) выдает разные результаты. В программе черт ногу сломит, поэтому примера пока нет. [pre2]* DBFNTX ... sost->(dbseek(a1)) // .T. sost->(dbseek(a2)) // .T. sost->(dbseek(a3)) // .T. [/pre2] [pre2]* LETO ... sost->(dbseek(a1)) // .T. sost->(dbseek(a2)) // .T. sost->(dbseek(a3)) // .F. !!!!!!!!!! [/pre2] В моем случаем вызов sost->(dbseek(a3), .T.) помогло.

Pasha: Dimka пишет: Еще, повторю, после использования команды USE с открытием нескольких индексов активный индекс по умолчанию - последний, вместо первого. Да, несовместимость с dbfntx имеет место быть однако. После dbSetIndex aka OrdListFocus в dbfntx фокус не меняется, а leto/ntx - меняется. Надо поправить

Pasha: Сравнение производительности rddnet и letodb Такой простенький тест. Если в cdxnetap.prg заменить функцию AppendSomeRecords [pre]STATIC FUNCTION AppendSomeRecords( nRecords ) LOCAL i LOCAL cPeerName := CdxNetGetClientIP( s_nConxn ) LOCAL nSec := Seconds() FOR i := 1 TO nRecords DbAppend() REPLACE abc->name WITH cPeerName REPLACE abc->dob WITH date() REPLACE abc->time WITH time() REPLACE abc->salary WITH 10000 + i NEXT DbCommit() ? 'Append ' + Str(Seconds() - nSec) nSec := Seconds() go top while ! eof() skip enddo ? 'Skip ' + Str(Seconds() - nSec) nSec := Seconds() for i := 1 to nRecords goto int(i/256) + 256 - (i%256) next ? 'Random ' + Str(Seconds() - nSec) wait RETURN NIL[/pre] И вызвать ее с параметром 20000, То rddnet даст результат: Append 103.81 Skip 7.80 Random 6.91 Результат letodb: Append 8.72 Skip 0.64 Random 3.95 Вывод: по операциям, которые оптимизируются в letodb: добавление, последовательная выборка, производительность letodb превышает производительность rddnet более чем на порядок (в 12 раз). По неоптимизированым операциям (грубо) в 2 раза. Причина этого очевидна. rddnet базируется на основе usrrdd и реазизован в медленном prg - коде. Это позиционируется как его преимущество и "правильный" подход. Естественно, что letodb со своей "неправильной" архитектурой сильно выигрывает в производительности. В rddnet сделать такую оптимизацию, как в letodb, будет затруднительно. Априори letodb находится в выигрышном положении. Удивляет другое. И letodb, и rddnet не вызвал почему-то особого интереса среди основной массы разработчиков Харбора. Если будет доведен rddnet, в котором будет реализована базовая функциональность dbfcdx, и у него будет более-менее приемлемая производительность, это будет хорошо для сообщества. Возможность выбора из 2-х продуктов - это польза для обеих. Но и с rddnet кроме Притпала Беди никто не возится

AlexMyr: Pasha пишет: Удивляет другое. И letodb, и rddnet не вызвал почему-то особого интереса среди основной массы разработчиков Харбора. Может пока заняты? Еще надо посмотреть что выдаст Przemek, тоже обещал, но вроде коммерческое. А он наверное сделает.

Pasha: Захотелось оптимизировать работу с memo В letofunc.c в ф-ии leto_rec после case HB_FT_MEMO: case HB_FT_BLOB: case HB_FT_PICTURE: case HB_FT_OLE: вместо выборки значения поля, при котором значение читается из dbt/fpt SELF_GETVALUE( (AREAP)pArea, ui+1, pItem ); проверять на непустое значение номера блока в самом файле dbf При этом снизится загрузка сервера. В связи с этим у меня вопрос: кроме размерности для memo 10 и 4 байта есть ли еще какие-нибудь форматы ?

AlexMyr: Pasha пишет: В связи с этим у меня вопрос: кроме размерности для memo 10 и 4 байта есть ли еще какие-нибудь форматы ? В harbour как я понимаю поддержка только этих HB_FT_MEMO: HB_FT_IMAGE: HB_FT_BLOB: HB_FT_OLE: или Вы про другое?

Pasha: Да, именно про это Я сделал вычисление размера мемо вместо чтения самого мемо-поля из дбт/фпт файла. Мемо-поля теперь считываются только по запросу с клиента

Pasha: Надо делать в LetoDB обработку запросов в нескольких потоках. В связи с этим в letofunc.c надо избавиться от некоторых static-переменных вроде pBufCrypt, bHrbError и некоторых других, чтобы разные потоки их совместно не использовали. Отсюда вопрос: куда лучше их затолкать: в USERSTRU, или сделать отдельную структуру LETOTHREAD, специально для этих целей ?

Pasha: По поводу обработки запросов на сервере в нескольких потоках. Наколько я понимаю, реализовать это на основе letocore.c не получится по причине того, что при обработке запросов потоком будет установлено окружение харбора: текущая р/о, кодовая страница, set-установки, которое разное для разных запросов, и потоки будет мешать друг другу. Надо делать это на основе leto_2.c Какие при этом могут быть ньюансы ?

alx_on: Pasha Примерно, полгода назад я пытался заинтересовать Кресина и остальных в этом форуме вопросом о разделении по потокам Но никто не откликнулся. Тогда я для себя все это дописал. Но т.к. никому было не интересно - сделал только под себя и свои нужды: например, совершенно не дорабатывал и не проверял транзакции и leto_Sum (leto_udf - точно не будет работать) Установка в качестве службы под WIN Есть дополнительные оптимизации по минимизации запросов к серверу (во завернул!) Например: 1. DBOI_ISDESC 2. DBOI_CUSTOM 3. DBOI_UNIQUE 4. SCOPE Исправление ошибок: 1. выделение памяти 2. GOTOP SKIP -1 GOTO( RECNO() ) - не сбрасывал флаги (типа BOF(), EOF() и т.д.) 3. Клиент неверно проверял признак блокировки в команде UN_LOCK( номер запись ) если номер записи не совпадал с текущей 4. Исправление ошибки с добавлением записи в заблокированную таблицу 5. Что то еще (не помню) Режим отладки (в INI "debug = 10") Настройка кол-ва таблиц (в INI "tables_max = 10000") Настройка кол-ва соединений (в INI "users_max = 1500") Файлы отладки (letodb*.log) создаются в папке с исполняемым файлом (Из INI выкинут параметр "LOG") При запуске в лог пишется основная информация о настройках Возможность запуска letodb (собранной как служба) в режиме командной строки (параметр "test") Ограничения: 1. Серверная часть писалась ТОЛЬКО под Harbour (из SVN, за декабрь 2010) 2. Проверялась только под mingw (win) и gcc (linux,mac) Известные глюки: 1. Редко - клиент отваливается, но сервер не сбрасывает соединение (dbf остаются открытыми) Бывает при обрыве связи (чаще), засыпании компа Сильно не мешает, но неакуратно (если требуется доступ к dbf, например, для удаления - не даст без перезапуска leto) Все это работает в боевом режиме в 3 местах (по 50-70 клиентов, каждый клиент открывает около 10 соединений, примерно 60 файлов в каждом соединении) Старая версия в такой ситуации стабильно падала раз в день Если интересно могу выложить

Pasha: Конечно выкладывайте. Но, поскольку многие собирают letodb и с xHarbour, могут возникнуть проблемы при сборке. Может пришлете мне сначала, я проверю сборку под xHb (с letocore.c), и, если все ОК, тогда сбросите на CVS Мой адрес tpe2 (at) mail . ru

Pasha: К слову. У меня letodb не падал ни разу, работает месяцами. Правда, он собран с xHarbour и крутится под win

alx_on: Pasha пишет: Конечно выкладывайте. Но, поскольку многие собирают letodb и с xHarbour Клиентская часть собираться должна и с xHarbour Для серверной части скачать и скомпилять Harbour не большая проблема

alx_on: http://zalil.ru/30561093

Pasha: Собрал letodb-mt под bcc55-harbour, а также клиентскую библиотеку под xHarbour Для сборки под bcc пришлось учесть различия в диалектах bcc и mingw Для сборки под xHarbour в common/common_c.c закомментировал //#include "hbthread.h" она вроде там не нужна, и в client/letomgmn.c я добавил #ifdef __XHARBOUR__ #define hb_snprintf snprintf #endif Сервис успешно запустился, клиентская программа с letodb работает. При вызове leto_MemoRead возникает gpf, с причиной пока не разбирался. Остальное вроде работает Результат правки сырцов отправил Вам по почте, на адрес, указанный в Changelog. По поводу дальнейшего развития letodb. Думаю, надо оставить вариант для сервера и без сервиса, для возможности работы под win98 По поводу поддержки сервера letodb без mt для xHarbour и старой версии Harbour - думаю, что последнее слово должно быть за Кресиным. Он ведь еще использует старую версию Hb А то, что вариант с mt надо включать в CVS - однозначно надо ! Отличная работа

Wolfv: Доброе время суток. Где то я наверное торможу, подскажите пожалуйста где ошибка? Есть клиентское приложение в котором присутствует следующий код: ... REQUEST LETO RDDSETDEFAULT( "LETO" ) Set EXCLUSIVE OFF use ( BaseDir + 'messtag.dbf' ) Alias mt new via "LETO" Set index TO ( BaseDir + "messtag_id.cdx" ), ( BaseDir + "messtag_tag.cdx" ), ( BaseDir + "messtag_val.cdx" ) .... Фрагмент процедуры поиска : ... Select mt Set order TO 3 Set filter TO MT->TAG = nTg DBSeek( PadR( AllTrim( Form_1.TxBox1.value ), FIELDSIZE( FieldPos( "VALUE" ) ) )) ... Если запущено одно клиентское приложение все работает нормально. При запуске второго клиента при попытке поиска (на втором клиенте ) вылетает ошибка LETO/1201 - Файл не проиндексирован. Сервер запущен с параметром Share_Tables = 1

Pasha: А зачем Вы создаете 3 индексных файла ? Можно ведь обойтись одним с тремя тэгами Конечно, я в таком режиме не проверял совместимость



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