Поделитесь опытом

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Поделитесь опытом

Сообщение gopstop2007 »

Код: Выделить всё

Из файла в MySQL создали  очередь
QueOstatWares        QUEUE,PRE(QUE)         !
Nid                  LONG                                  !
N_ID_Items           SHORT                           !порядковый номер реализатора
NWARES               SHORT                            !инд номер товара
Ostatok              LONG                               !остаток по релизатору
                     END                                      !

====Аналог вышеуказаного файла в TPS только без поля пользов. который берется с № компьютера при подключении к базе ====

WARES                   FILE,DRIVER('TOPSPEED'),NAME('wares.TPS')
WAR:NWARESKEY        KEY(+WAR:NWARES),NOCASE,OPT,PRIMARY

RECORD               RECORD
WAR:NWARES         SHORT
WAR:OSTAT            LONG
                     END
                   END

необходимо используя 'Пользов.' и 'Код товара' изменить 'Остаток товара' в файле MySQL(SQLOstatkiAll) или добавить, если записи нет.
Вот вырисовалось

Код: Выделить всё

SET(WAR:NWARESKEY)
LOOP
    NEXT(WARES)
    IF ERRORCODE() THEN BREAK END
    QUE:NWARES = WAR:NWARES
    GET(QueOstatWares,QUE:NWARES)
    IF ERRORCODE()
      SQLOstatkiAll:N_ID_Items = SETUP:N_OutItems  ! № компа
      SQLOstatkiAll:NWARES     = WAR:NWARES
      SQLOstatkiAll:Ostatok    = WAR:EditOstat
      IF MAVInsert(SQLOstatkiAll) ! insert
        MAVSHOWERROR
        !RETURN
      END
    ELSE
      SQLOstatkiAll:Nid        = QUE:Nid
      SQLOstatkiAll:N_ID_Items = SETUP:N_OutItems ! № компа
      SQLOstatkiAll:NWARES     = WAR:NWARES
      SQLOstatkiAll:Ostatok    = WAR:EditOstat
      IF MAVUpdate(SQLOstatkiAll) ! change
        MAVSHOWERROR
        !RETURN
      END
    END
END
Вопрос: Есть ли более простая конструкция или аналог REPLACE или еще чего, так как при обращении только одного пользователя обрабатывается около 5000 записей , а таких пользователей до пятнадцати.
Принцип работы, пользователь при подключении к серверу (не постоянное соединение), происходит сравнение записей остатков находящихся на компьютере с остатком на сервере и изменение при необходимости.
Буду рад любой критике, так как дилетант в данном вопросе.
MySQL Clarion 6.3 9058 ABC
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Поделитесь опытом

Сообщение Алексей- Софт-Центр »

Добрый день!
Правильно ли я Вас понял, что:
1. Сначала Вы читаете в очередь SQL - файл
2. Потом сравнивая его с локальным TPS
3. Измененные (или несуществующие)данные записываете обратно в SQL.

Если так, то я бы сделал немного подругому, сократив количество обращений с сервером
и тем самым ускорив данную процедуру.

1. Сначала записать локальный TPS в MySQL базу
2. Выполнить хранимую MySQL-процедуру, которая выполнит обновление/добавление записей в основном MySQL-файле.

Правда, на вкус и цвет ... :)

Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Поделитесь опытом

Сообщение kreator »

Не понятно, почему обрабатываются 5000 записей. У вас же поиск идет по индексу (ключу).
Вообще, поиск по ТРS, по-моему, делается так:
clear(WAR:Record)
WAR:NWARES = QUE:NWARES
SET(WAR:NWARESKEY,WAR:NWARESKEY)
LOOP
NEXT(WARES)
..
END
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Поделитесь опытом

Сообщение gopstop2007 »

Алексей- Софт-Центр писал(а):Добрый день!
Правильно ли я Вас понял, что:
1. Сначала Вы читаете в очередь SQL - файл
2. Потом сравнивая его с локальным TPS
3. Измененные (или несуществующие)данные записываете обратно в SQL.
Абсолютно, правильно.
Алексей- Софт-Центр писал(а):Добрый день!
1. Сначала записать локальный TPS в MySQL базу
2. Выполнить хранимую MySQL-процедуру, которая выполнит обновление/добавление записей в основном MySQL-файле.

по 2 пункту, есть ли возможность кинуть образец хранимой процедуры, по которой я мог бы создать свою, так как я это буду делать в первый раз
kreator писал(а):Не понятно, почему обрабатываются 5000 записей. У вас же поиск идет по индексу (ключу).
не совсем ясен вопрос, почему обрабатываются ВСЕ записи? потому чтобы ВСЕ записи, что на MySQL и в файле TPS должны быть между собой идентичными (одинаковыми)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Поделитесь опытом

Сообщение kreator »

Тогда всё правильно. Всё равно придется делать 5000 обращений к SQL серверу (максимально). Я бы не стал переделывать, овчинка выделки не стоит (ИМХО).
А изначально какая идея этой задачи? Репликация данных? Между удаленными точками и центральным офисом?
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Поделитесь опытом

Сообщение gopstop2007 »

kreator писал(а):Тогда всё правильно. Всё равно придется делать 5000 обращений к SQL серверу (максимально). Я бы не стал переделывать, овчинка выделки не стоит (ИМХО).
А изначально какая идея этой задачи? Репликация данных? Между удаленными точками и центральным офисом?
вернее 5000*15 обращений к серверу. Задача - объединение остатков для совместного просмотра. Да, репликация, только той части которая доступна для данного пользователя, остальные данные только для просмотра.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Поделитесь опытом

Сообщение kreator »

А 15 пользователей - с разных компьютеров? В разное время идёт репликация?
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Поделитесь опытом

Сообщение gopstop2007 »

kreator писал(а):А 15 пользователей - с разных компьютеров? В разное время идёт репликация?
да, с разных компьютеров. Насчет времени, кто когда запросит, не исключается одновременная (15) репликация. Тут одновременная работа (добавление, изменение, удаление)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Поделитесь опытом

Сообщение Алексей- Софт-Центр »

Добрый день!
Всё равно придется делать 5000 обращений к SQL серверу (максимально).
Немного не правильно!!!! :)
Сначала идет считывание ( 5000 обращений) из MySQL в очередь.
Потом сравнение и изменение /дополнение N-записей из программы в MySQL (еще N- обращений).
Где N от 0 (что маловероятно) до 5000 .
Следовательно при таком варианте количество обращений к MySQL = 5000+N.
При варианте с хранимым запросом:
Количество обращений:
1 - выполнить хранимую процедуру очистки таблицы для хранения данных TPS файла пользователя.
5000 - записать данные из TPS в таблицу MySQL
1 - выполнить хранимую процедуру изменение /дополнение записей.
ИТОГО = 1+5000+1=5002
(арифметика-царица наук! :) )

По поводу хранимой процедуры:
все достаточно просто смотри формат :
INSERT INTO ... ON DUPLICATE UPDATE ...
Если не разберешься - стучись помогу.
Алексей
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Поделитесь опытом

Сообщение gopstop2007 »

По поводу хранимой процедуры:
почитал, говорится о том, сервер SQL желательно (правильно) использовать только для хранения данных, а все операции с большим объемом данных при использовании всех записей для модификации лучше выполнять на клиенте. Типа идет нагрузка на сервер, и увеличивается время доступа других пользователей к серверу. тем более у меня возможно выполнение до 15 хранимок одновременно, не велика ли нагрузка на сервер?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Поделитесь опытом

Сообщение Алексей- Софт-Центр »

Добрый день!
сервер SQL желательно (правильно) использовать только для хранения данных
Это "версия" , которая тоже имеет право на жизнь :)

Нагрузка на сервер конечно увеличится, но на сколько???
Проверить просто: создайте хранимую процедуру и посмотрите время ее выполнения.
Ну или включайте логи MySQL и смотрите какие запросы пользователей как долго обрабатываются..
но это уже тема не Клариона, а Администрирования MySql

P.S. На сколько я понял, вся работа у Вас ведется на локальной машине пользователя, а только в какое-то время
происходит "синхронизация" с MySql.


Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Поделитесь опытом

Сообщение kreator »

Предлагаю следующее. Поскольку репликация, судя по описанию, идет в одну сторону (из TPS в MySQL), то сделайте тест - с одного клиента добавьте 75000 записей в таблицу MySQL (именно в ту, какую надо), но сделайте формирование записей на клиенте в памяти, без использования TPS, посмотрите время выполнения. Я давным давно делал такие тесты, найду у себя, проверю. Просто думаю 75000 записей для SQL сервера - ничто, дробина для слона.
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Поделитесь опытом

Сообщение Алексей- Софт-Центр »

Добрый день!
Поскольку репликация, судя по описанию, идет в одну сторону
В обе: сначали из, потом в MySql
с одного клиента добавьте 75000 записей в таблицу MySQL
Вот здесьб будет "засада":
так как кларион добавляет записи , использую previous оператор, то такое добавление будет ну очень долгое!

Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Поделитесь опытом

Сообщение kreator »

Сделал я тест. Создал таблицу на сервере, такую же как у gopstop2007.
Добавление 50000 записей проходит за 23 сек. Update 50000 записей за 25 сек.
Правда MAV не использую, запросы по prop:SQL. И в качестве сервера Sybase SQL Anywhere 12, MySQL нет под рукой.
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Поделитесь опытом

Сообщение Алексей- Софт-Центр »

Добрый день!
Создал две таблицы в MySql.
В одну записал 50 000 записей .
Вторая таблица аналог первой.
Время выполнения запроса:

insert INTO t2 SELECT * from t1 on duplicate key
update t2.c1=t1.c1,t2.c2=t1.c2 ;

Хранимая процедура 'proba.p' была успешно выполнена.
proba_t2: Запрос открыт за 0.003c [0.002c выполнение, 0.001c выборка]

Так что особенной "нагрузки" на сервер не наблюдается.

Алексей
Ответить