Автор | Сообщение |
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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.
|
|
|
Ответов - 316
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|
Pasha
|
| Администратор
|
Пост N: 1529
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.06.10 11:32. Заголовок: Pasha пишет: Оптими..
Pasha пишет: цитата: | Оптимизация вызовов dbCommit() dbUnlock() |
| Надо все-таки реализовать на клиенте pLocksPos, тем более это все равно нужно. Тогда при вызове flush (если установлен флажок) можно будет делать сразу unlock. А при unlock проверять на клиенте pLocksPos, и, если он пуст, ничего не делать В результате мы получим один пакет при обновлении данных вместо трех
|
|
|
Pasha
|
| Администратор
|
Пост N: 1530
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.06.10 12:21. Заголовок: Я смотрю, в leto_Put..
Я смотрю, в leto_PutRec после if( bTransActive ) нет вызова free( szData ); наверное, он нужен
|
|
|
alkresin
|
| moderator
|
Пост N: 354
Зарегистрирован: 06.07.06
|
|
Отправлено: 23.06.10 15:53. Заголовок: нет вызова free( szD..
цитата: | нет вызова free( szData ); наверное, он нужен |
| Да.
|
|
|
alkresin
|
| moderator
|
Пост N: 355
Зарегистрирован: 06.07.06
|
|
Отправлено: 23.06.10 16:03. Заголовок: Надо все-таки реализ..
цитата: | Надо все-таки реализовать на клиенте pLocksPos, тем более это все равно нужно. Тогда при вызове flush (если установлен флажок) можно будет делать сразу unlock. А при unlock проверять на клиенте pLocksPos, и, если он пуст, ничего не делать |
| Это хорошо, если программист пишет строго "как в книжке рекомендовано". А если он почему-то после commit опять начнет корректировать данные ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 1531
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.06.10 16:19. Заголовок: alkresin пишет: Это..
alkresin пишет: цитата: | Это хорошо, если программист пишет строго "как в книжке рекомендовано". А если он почему-то после commit опять начнет корректировать данные ? |
| Так инструмент дается тому, кто понимает, зачем он нужен и как его использовать. А если не понимает - проблемы индейцев шерифу безразличны. Кто не понимает, тот пусть не устанавливает этот флажок. Пусть это будет функция вида: Leto_UnlockOptimize( lOn/lOff ) и использование будет рекомендовано так: Leto_UnlockOptimize( .t. ) dbCommit() dbUnlock() Leto_UnlockOptimize( .f. )
|
|
|
alkresin
|
| moderator
|
Пост N: 356
Зарегистрирован: 06.07.06
|
|
Отправлено: 23.06.10 20:39. Заголовок: и использование буде..
цитата: | и использование будет рекомендовано так: Leto_UnlockOptimize( .t. ) dbCommit() dbUnlock() Leto_UnlockOptimize( .f. ) |
| Тогда уж лучше какая-нибудь leto_Unlock() вместо этих четырех строк.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 1378
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.06.10 21:51. Заголовок: А как по коду можно ..
А как по коду можно определить какой драйвер используется ? Т.е. LetoDB() или стандартный CDX ? Хочется иметь в одной задаче ОДНОВРЕМЕННО ДВА драйвера !!! Т.е. иметь локальный вариант и файл-серверный и LetoDB-драйвер. Соответственно в коде нужно будет тогда делать условия обработки: 1) для CDX 2) для LetoDB
|
|
|
Pasha
|
| Администратор
|
Пост N: 1532
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 09:51. Заголовок: Andrey пишет: Хочет..
Andrey пишет: цитата: | Хочется иметь в одной задаче ОДНОВРЕМЕННО ДВА драйвера !!! |
| Да хоть 10 драйверов можно подключать. В dbUseArea 2-й параметр - это используемый rdd. Можно указаль LETO, или DBFCDX, или что угодно. Параметр есть и в dbCreate А проверка, какой драйвер используется в рабочей области - вызов RddName()
|
|
|
Pasha
|
| Администратор
|
Пост N: 1533
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 10:00. Заголовок: Есть таблица размеро..
Есть таблица размером 62М, 620 тыс. записей Создается тэг, в нем 3 индекса. Если запущен letodbtray, который здесь дал SashaBG, то при создании индекса может возникать ошибка: Create error (1-1081): 1081 - это argument error + Если не запущен letodbtray, то ошибка не возникает. letodbtray с интервалом в 1 сек вызывает leto_connect для проверки, жив ли сервер. Время индексации - примерно 10 сек. Я в лог добавляю аргументы при ошибке и вижу: 24.06.10 09:44:21: Create error (1-1081): Arguments: ( [ 1] = Type: C Val: 08232078, [ 2] = Type: N Val: 0)carecs.CDX индексное выражение для 1-го индекса такое: Stock+Code+DTOS(Date)+NDT 1-й аргумент "08232078" - это как раз Stock+Code. 2-й аргумент - это результат DTOS(), который нулем буть никак не может, но тем не менее... Т.е., вызов leto_connect() каким-то образом прерывает индексацию Сервер при этом не падает. PS Ошибка при LTrim - похоже из этой же серии, когда аргумент не может быть числовым, но тем не менее им оказывается.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1534
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 10:24. Заголовок: Т.е., вызов leto_con..
Т.е., вызов leto_connect() с другого клиента портит стек харбора
|
|
|
Pasha
|
| Администратор
|
Пост N: 1535
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 10:38. Заголовок: Сервер был собран с ..
Сервер был собран с xHarbour С Harbour ошибка возникает намного реже, но все равно возникает. С Harbour индексация выполняется немного быстрее, так что коллизия возникает реже
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 1537
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 11:21. Заголовок: Я использую xHarbour..
Я использую xHarbour с кодовой страницей RU1251 Сейчас она называется RUWIN Если использовать клиенты xHb с сервером letodb, собранным с Harbour, то где-то надо транслировать имя кодовой страницы Подскажите красивое решение, где это лучше сделать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1538
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 11:30. Заголовок: Pasha пишет: Т.е., ..
Pasha пишет: цитата: | Т.е., вызов leto_connect() с другого клиента портит стек харбора |
| Может быть, дело в вызове hb_retni() в функции hb_ipclose() ? Он там не нужен, его можно перенести в HB_FUNC( HB_IPCLOSE )
|
|
|
Pasha
|
| Администратор
|
Пост N: 1539
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.06.10 11:40. Заголовок: Да, дело именно в эт..
Да, дело именно в этом, лечение помогло, теперь полет нормальный Надо еще пересмотреть остальные hb_ret* в этом модуле Может, и проблема alx_on в этом состояла
|
|
|
alkresin
|
| moderator
|
Пост N: 357
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.06.10 16:04. Заголовок: Да, дело именно в эт..
цитата: | Да, дело именно в этом, лечение помогло, теперь полет нормальный |
| Здорово! Нашлась ошибка, которая реально могла доставлять проблемы.
|
|
|
alkresin
|
| moderator
|
Пост N: 358
Зарегистрирован: 06.07.06
|
|
Отправлено: 25.06.10 09:03. Заголовок: Если использовать кл..
цитата: | Если использовать клиенты xHb с сервером letodb, собранным с Harbour, то где-то надо транслировать имя кодовой страницы |
| По-видимому, надо в строчку с версией, передаваемой клиенту при соединении, включить информацию о том, чем собран сервер ( Harbour/xHarbour ), тогда клиент при необходимости может, в соответствии с хранящейся у него таблицей, подменить название кодовой страницы.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1540
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.06.10 11:22. Заголовок: Хочется добавить в A..
Хочется добавить в AREASTRU на сервере клиентский алиас таблицы Это понадобится в дальнейшем для выполнения клиентских процедур на сервере. Можно следать на сервере функцию, которая бы возвращала реальный алиас по клиентскому в окружении текущего пользователя, чтобы затем в процедуре по нему обращаться к таблице Для начала можно сделать хотя бы триггеры, тем более dbfcdx их поддерживает
|
|
|
alkresin
|
| moderator
|
Пост N: 359
Зарегистрирован: 06.07.06
|
|
Отправлено: 25.06.10 14:48. Заголовок: Хочется добавить в A..
цитата: | Хочется добавить в AREASTRU на сервере клиентский алиас таблицы |
| Да, надо добавить. Мне даже казалось, что он уже где-то хранится, потому что задумка такая была.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1541
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.06.10 10:46. Заголовок: Выявил и устранил ещ..
Выявил и устранил еще один неприятный глючек Блокируем запись по rlock Затем перемещаемся назад, что-то делаем, в том числе rlock - unlock на другой записи По skip возвращаемся на начальную запись Выдаем RLock. Клиент не перечитывает запись с сервера, поскольку она в есть буфере skip Затем по RLock клиент на сервер запрос не выдает, так считает что запись блокирована, а блокировка уже снята В результате при Commit получаем lock required Надо очищать буфер skip на клиенте при unlock Вопрос. В каких еще случаях это надо делать ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 1542
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.06.10 10:53. Заголовок: Попутно еще такой во..
Попутно еще такой вопрос. RLock() блокирует только текущею запись. Если ранее была блокирована другая запись, то такая блокировка должна сниматься. А в leto на сервере в leto_RecLock структура pAStru->pLocksPos не очищается Это правильно ?
|
|
|
Ответов - 316
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|