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

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

Dima: Продолжаем тут

Ответов - 191, стр: 1 2 3 4 5 6 7 8 9 10 All

Dima: Я пробовал играться с аналогом LETO_SETSKIPBUFFER , в ADS и особого ускорения не увидел. Пробовал руками разные значения и спец функцию........ Функция такая , для определения кол-ва кэшируемых записей [pre2] Func LenReCash(als) local ret:=0 local i FOR i = 1 TO (als)->(fcount()) ret+=(als)->(FIELDSIZE(i)) NEXT ret+=4 return int((65535/ret)/5.4) [/pre2]

alkresin: Честно говоря, не понял, как это определяет количество кэшируемых записей и что это за магические числа = 65535 и 5.4 :). Не помню уже аналог из ADS, но для LetoDB эта функция ( leto_setskipbuffer()) реально работает, если применять ее по назначению - например, увеличить буфер при последовательном чтении dbf.

Dima: alkresin пишет: Не помню уже аналог из ADS AdsCacheRecords()

SkyNET: alkresin пишет: Путь к библиотекам прописан: /apps/harbour/lib, а они у вас, по вашим словам, в /apps/harbour/lib/linux/gcc/libhbvm.a Спасибо, действительно, не обратил внимания. Но теперь возникла другая ошибка: [pre2]gcc obj/linux/server.o obj/linux/common.o obj/linux/hbip.o obj/linux/common_c.o obj/linux/blowfish.o obj/linux/leto_2.o obj/linux/letofunc.o obj/linux/letolist.o obj/linux/letoacc.o obj/linux/letovars.o obj/linux/leto_lnx.o obj/linux/errint.o obj/linux/errorsys.o -obin/letodb -L/apps/harbour/lib -Wl,--start-group -lhbvm -lhbrtl -lhbcpage -lhblang -lhbrdd -lhbrtl -lhbmacro -lhbpp -lgtstd -lrddntx -lrddcdx -lrddfpt -lhbcommon -lhbsix -Wl,--end-group -lm -lpthread obj/linux/leto_2.o: In function `thread2': leto_2.c:(.text+0x79d): undefined reference to `hb_vmThreadInit' leto_2.c:(.text+0x918): undefined reference to `hb_vmThreadQuit' collect2: ld returned 1 exit status make: *** [bin/letodb] Error 1[/pre2]

alkresin: SkyNET пишет: gcc ... -obin/letodb -L/apps/harbour/lib -Wl,--start-group -lhbvm -lhbrtl ... Вообще-то здесь должна быть hbvmmt, а не hbvm. Какая у вас версия letodb и где вы ее взяли ?

alkresin: alkresin пишет: Какая у вас версия letodb и где вы ее взяли ? Ясно, у нас там лежит для скачивания старая версия. Воспользуйтесь CVS: @echo off SET CVSROOT=:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb SET HOME=C:\CVS\ c:\cvs\cvs login c:\cvs\cvs checkout -r rel-1-mt -P letodb Или на Sourceforge вот тут: http://letodb.cvs.sourceforge.net/viewvc/letodb/letodb/?pathrev=rel-1-mt внизу страницы - Download GNU tarball

alkresin: Загрузил на Sourceforge letodb-2.15-src.zip - самые свежие исходники.

SkyNET: alkresin пишет: Ясно, у нас там лежит для скачивания старая версия. alkresin пишет: Или на Sourceforge вот тут: http://letodb.cvs.sourceforge.net/viewvc/letodb/letodb/?pathrev=rel-1-mt внизу страницы - Download GNU tarball Спасибо, с новой версией собралось без проблем.

Andrey: alkresin пишет: Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом. Что то не компилируется... Выдает ошибку: Harbour 3.2.0dev (r1503131756) Copyright (c) 1999-2015, http://harbour-project.org/ demo_letodb.prg(269) Error E0030 Syntax error "syntax error at 'TRANSACTION'" demo_letodb.prg(298) Error E0010 ENDIF does not match IF 2 errors Может в коде неправильно ставлю ? bErrHandler := ErrorBlock( { | VAR | BREAK( VAR ) } ) BEGIN SEQUENCE USE ( cFileDbf2 ) Alias TEMP866 NEW VIA "DBFCDX" CODEPAGE "RU866" SHARED RECOVER MsgStop( "БАЗА (BASE)" + cFileDbf2 + " уже открыта (now open) !", "Ошибка ! Error !" ) RETURN END SEQUENCE ErrorBlock( bErrHandler ) SELECT TEMP866 aDbf := DbStruct() // создание базы 1251 / create a database 1251 cFileDbf := cPathServer + "test1251.dbf" DBCreate( cFileDbf, aDbf, "LETO" ) USE ( cFileDbf ) Alias TEMP1251 NEW VIA "LETO" CODEPAGE "RU1251" EXCLUSIVE begin transaction SELECT TEMP866 GOTO TOP DO WHILE !EOF() // считываем значение полей в массив aFieldArray := {} FOR nI := 1 TO FCOUNT() AADD( aFieldArray, FIELDGET( nI ) ) NEXT SELECT TEMP1251 APPEND BLANK FOR nI := 1 TO FCOUNT() FIELDPUT( nI, aFieldArray[ nI ] ) NEXT SELECT TEMP866 SKIP ENDDO end transaction CLOSE TEMP866 CLOSE TEMP1251

PSP: 1. REQUEST LETO не забыл? 2. И может на самом деле проблема в "demo_letodb.prg(298) Error E0010 ENDIF does not match IF" ?

alkresin: Это я уже подзабыл. Правильно будет: LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION()

PSP: alkresin пишет: Правильно будет: LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION() Да, точно. )

SergKis: Andrey а мой пример не смотрел ? там же все есть, даже с буфером для транзакции (его размер по умолчанию, раньше был небольшой и при широкой записи были проблемы - буфер перевыделялся и загрузка шла долго, потом Pasha подправлял) я всегда использую буфер

Dima: Andrey Заведи #command BEGIN TRANSACTION => LETO_BEGINTRANSACTION() #command END TRANSACTION => LETO_COMMITTRANSACTION()

Andrey: Dima пишет: а мой пример не смотрел ? Смотрел, просто решил маленький пример сначала сделать, а потом уж поболее делать. PSP пишет: 1. REQUEST LETO не забыл? 2. И может на самом деле проблема в "demo_letodb.prg(298) Error E0010 ENDIF does not match IF" ? 1) Стоит. 2) до этого не доходить, ошибка компиляции до этого, а эта ошибка неправильно вылазит..

Andrey: alkresin пишет: LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION() Компилирует нормально, но вылетает при работе: Error DBFCDX/1031 Синтаксическая ошибка</p><BR> Called from LETO_COMMITTRANSACTION(0) Called from CREATEDBF1251(290) Called from (b)MAIN(87) Called from _DOCONTROLEVENTPROCEDURE(1651) Called from EVENTS(1516) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1373) Called from MAIN(125) Строка (290) - LETO_COMMITTRANSACTION()

Andrey: alkresin пишет: Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию, или серию транзакций по группе записей в пакете - и количество обращений туда-сюда, а, соответственно, и затраченное время в разы уменьшится. Я был не прав. Тормоза в тесте были от показа GRID'a ! Сделал правильный тест, 5000 записей (4 поля) : 1) отправка на сервер в инете (в моем городе) БЕЗ транзакций: 15 сек. 2) отправка на сервер в инете (в Москву) БЕЗ транзакций: 1 мин. 57 сек. Просто супер... Не знаю как дальше будет, если базу увеличить... Бегунок тоже сделал.... Только AVI-ка замирает при передаче... Не особенно красиво, хотя собираю с ключом -mt. Кому интересно - вот пример на МиниГуи https://cloud.mail.ru/public/0a167351289f/LetoDB-demo-MiniGui.7z

SergKis: Andey пишет: вот пример на МиниГуи 1. вынеси connect до окна (если его нет, то сообщение и конец) или в oninit (тогда сначала контрлы hide или disable, если connect есть переводи в рабочее соостояние, иначе сообщение ...). 2. в цикл загрузки ставь do events 3. если файл на сервере постоянный и с индексами, то делай OrdSetFocus(0), zap, загрузку, reindex, OrdSetFocus(1) 4. не мучай grid перезагрузкой Item-ов, используй browse (skipbuffer устанавливай в кол-во строк в browse (default 10)) 5. получить длину записи области RecSize()+1, или посчитать длины из dbStruct() и +1.

alkresin: Andrey пишет: Компилирует нормально, но вылетает при работе: Error DBFCDX/1031 Синтаксическая ошибка</p><BR> Called from LETO_COMMITTRANSACTION(0) Вставьте перед LETO_COMMITTRANSACTION(): SELECT TEMP1251 Уж не помню, почему это было сделано, но при committransaction текущей должна быть удаленная таблица.

SergKis: Andrey пишет:Строка (290) - LETO_COMMITTRANSACTION() транзакция leto для областей rdd LETO, для др. rdd могут быть свои механизмы транзакций ... SELECT TEMP866 SKIP ENDDO // здесь DBFCDX !!! LETO_COMMITTRANSACTION() //end transaction alkresin пишет:Вставьте перед LETO_COMMITTRANSACTION(): SELECT TEMP1251 +1 SergKis пишет: // текущий alias это LETO таблица - leto_BeginTransaction(nMaxBuf)... просто Андрею немного внимательней надо см. примеры



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