On-line: Haz, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
alkresin
moderator


Пост N: 31
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 31.01.08 11:36. Заголовок: Leto DB Server(продолжение)


Только что открыл на 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 на Харборе, ... и вообще все в наших руках :).

Кто хочет участвовать в разработке, тестировании - пишите.



Спасибо: 0 
Профиль
Ответов - 301 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]


AlexMyr



Пост N: 127
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 25.01.11 16:25. Заголовок: Dimka пишет: пытаюс..


Dimka пишет:

 цитата:
пытаюсь начать пользоваться letodb. на одном большом рассчете программка начинает течь и занимает 1гб оперативы


Попробуйте сделать маленький самодостаточный пример и на нем потестировать, и если будут проблемы, тогда пример в студию.

Спасибо: 0 
Профиль
Dimka



Пост N: 4
Зарегистрирован: 13.01.11
ссылка на сообщение  Отправлено: 26.01.11 17:37. Заголовок: Использование letodb..


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

UPD.
SET EXACT OFF включает мягкий поиск, но он то ли слетает, то ли неправильно работает. dbseek выдает False там где должен выдавать True.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1810
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.01.11 18:00. Заголовок: Dimka пишет: SET EX..


Dimka пишет:

 цитата:
SET EXACT OFF не включало мягкий поиск как раньше и DBSEEK возвращал False.



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

Спасибо: 0 
Профиль
Dimka



Пост N: 5
Зарегистрирован: 13.01.11
ссылка на сообщение  Отправлено: 26.01.11 20:58. Заголовок: Ыыыыы...точняк! Я ещ..


Ыыыыы...точняк! Я еще поэкспериментирую, но факт остается фактом. Один и тот же код при DBFNTX и LETO(NTX) выдает разные результаты. В программе черт ногу сломит, поэтому примера пока нет.

 цитата:
* DBFNTX 
...
sost->(dbseek(a1)) // .T.
sost->(dbseek(a2)) // .T.
sost->(dbseek(a3)) // .T.




 цитата:
* LETO 
...
sost->(dbseek(a1)) // .T.
sost->(dbseek(a2)) // .T.
sost->(dbseek(a3)) // .F. !!!!!!!!!!


В моем случаем вызов sost->(dbseek(a3), .T.) помогло.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1811
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.01.11 21:10. Заголовок: Dimka пишет: Еще, п..


Dimka пишет:

 цитата:
Еще, повторю, после использования команды USE с открытием нескольких индексов активный индекс по умолчанию - последний, вместо первого.



Да, несовместимость с dbfntx имеет место быть однако. После dbSetIndex aka OrdListFocus в dbfntx фокус не меняется, а leto/ntx - меняется. Надо поправить

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1825
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.02.11 15:53. Заголовок: Сравнение производит..


Сравнение производительности rddnet и letodb

Такой простенький тест. Если в cdxnetap.prg заменить функцию AppendSomeRecords

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


И вызвать ее с параметром 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 кроме Притпала Беди никто не возится


Спасибо: 0 
Профиль
AlexMyr



Пост N: 156
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 18.02.11 18:02. Заголовок: Pasha пишет: Удивля..


Pasha пишет:

 цитата:
Удивляет другое. И letodb, и rddnet не вызвал почему-то особого интереса среди основной массы разработчиков Харбора.


Может пока заняты?
Еще надо посмотреть что выдаст Przemek, тоже обещал, но вроде коммерческое. А он наверное сделает.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1827
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.02.11 13:48. Заголовок: Захотелось оптимизир..


Захотелось оптимизировать работу с 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 байта есть ли еще какие-нибудь форматы ?

Спасибо: 0 
Профиль
AlexMyr



Пост N: 160
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 21.02.11 17:06. Заголовок: Pasha пишет: В связ..


Pasha пишет:

 цитата:
В связи с этим у меня вопрос: кроме размерности для memo 10 и 4 байта есть ли еще какие-нибудь форматы ?


В harbour как я понимаю поддержка только этих
HB_FT_MEMO:
HB_FT_IMAGE:
HB_FT_BLOB:
HB_FT_OLE:

или Вы про другое?

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1828
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.02.11 22:38. Заголовок: Да, именно про это Я..


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

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1830
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 22.02.11 15:06. Заголовок: Надо делать в LetoDB..


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


Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1832
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.11 09:33. Заголовок: По поводу обработки ..


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


Спасибо: 0 
Профиль
alx_on
постоянный участник


Пост N: 103
Зарегистрирован: 07.07.09
ссылка на сообщение  Отправлено: 24.02.11 12:27. Заголовок: Pasha Примерно, пол..


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 файлов в каждом соединении)
Старая версия в такой ситуации стабильно падала раз в день

Если интересно могу выложить

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1834
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.11 12:34. Заголовок: Конечно выкладывайте..


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

Мой адрес tpe2 (at) mail . ru

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1835
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.11 12:37. Заголовок: К слову. У меня leto..


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

Спасибо: 0 
Профиль
alx_on
постоянный участник


Пост N: 104
Зарегистрирован: 07.07.09
ссылка на сообщение  Отправлено: 24.02.11 12:37. Заголовок: Pasha пишет: Конечн..


Pasha пишет:

 цитата:
Конечно выкладывайте. Но, поскольку многие собирают letodb и с xHarbour


Клиентская часть собираться должна и с xHarbour
Для серверной части скачать и скомпилять Harbour не большая проблема


Спасибо: 0 
Профиль
alx_on
постоянный участник


Пост N: 105
Зарегистрирован: 07.07.09
ссылка на сообщение  Отправлено: 24.02.11 12:40. Заголовок: http://zalil.ru/3056..

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1836
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.02.11 17:36. Заголовок: Собрал letodb-mt под..


Собрал 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 - однозначно надо ! Отличная работа


Спасибо: 0 
Профиль
Wolfv



Пост N: 9
Зарегистрирован: 03.09.09
ссылка на сообщение  Отправлено: 10.03.11 12:09. Заголовок: Доброе время суток. ..


Доброе время суток.
Где то я наверное торможу, подскажите пожалуйста где ошибка? Есть клиентское приложение в котором присутствует следующий код:
...
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




Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1844
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.03.11 14:53. Заголовок: А зачем Вы создаете ..


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

Спасибо: 0 
Профиль
Ответов - 301 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 320
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет