Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Не пинайте сильно. :)
Как правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?
6 апр 18, 10:10    [21317716]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
MaestroEv,

Зависит от вкуса)
Я работаю по 2.
6 апр 18, 11:44    [21318099]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Просто нет работы с таймингами и прочими вещами соединений.
Мне проще так, но терзают смутные сомнения.. :)

-Начать соединение, взять данные, закрыть, вывести данные на экран.
-Отредактировать , открыть соединение, записать в базу, закрыть соединение.
То есть всегда на короткий миг открывать соединение только для обращения к базе, потому что самое медленное - это интерфейс.
9 апр 18, 02:29    [21322203]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
asdor
MaestroEv,

Зависит от вкуса)
Я работаю по 2.


Спасибо.
9 апр 18, 02:31    [21322204]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
MaestroEv,
Описанный вами вариант, "открыть -действия- закрыть"
Мне кажется более предпочтительным.

Я держу 1 соединение, из-за некоторых особенностей архитектуры.
(Просто к БД коннектятся, как 1 пользователь, а в бд, есть своя система юзеров, прав, монитора...)
9 апр 18, 07:47    [21322270]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8736
MaestroEv
Как правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?

Это зависит от многих причин.

Не вдаваясь в подробности - если много клиентов у сервера, то однозначно вариант 1 (со стороны разработчика).
Если нагрузка небольшая то можно использовать и вариант 2.

В реальной же жизни - всё зависит от драйвера который Вы используете для connection. И как правило это "смесь" открытых connections in the pool. Дело в том, что предоставление новых connection на стороне сервера довольно затратная операция.
9 апр 18, 09:19    [21322328]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Продолжим.
Часто пользуюсь подобными конструкциями:
**
DEFINE BAR 4 OF sprav PROMPT "\<Справочник" SKIP FOR !DOSTUP("Доступ к справочнику")
ну или
IF DOSTUP("СОЗДАНИЕ_НОВОГО_КЛИЕНТА")
=CREANEWKLI()
ENDIF
***

Ранее в таблицах VFP это работало на ура.
Модуль DOSTUP Обращается к таблицам и проверяет доступ.
В условиях MySQL , полагаю это слишком расточительно и скорость упала до неприемлимой, потому что модуль DOSTUP
теперь всякий раз стучится к MySQL , а это похоже не шустрое мероприятие.. Тем более пунктов меню предостаточно, да и доступов разных в программе масса подобного типа:

Вопросы.
- Правильно ли я полагаю, что надо как-то закэшировать (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше? Или есть варианты?
Ну и как продолжение .. как тогда проверить дату изменения на сервере таблицы, чтобы это было быстро, без коннекта к MySql, чтобы в случае изменения таблицы на MySql - обновлять ее и на фоксе?

Спасибо.
24 апр 18, 03:22    [21362906]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8736
В общем случае всё зависит от многих причин - скорости Вашего доступа к SQL Server, загруженности самого сервера etc...

Вопросы.
- Правильно ли я полагаю, что надо как-то закэшировать

* правильно, большинство "больших" программ так и работает.

- (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше?

* в общем не правильно. Данные должны быть уже в памяти приложения. Создайте свой класс кэша в FoxPro - у него должно быть ограничено время, когда кэш устаревает и при новом обращении к массиву данных - происходит обновление с сервера. В MS SQL Server есть встроенная функция оповещения подписчиков если данные за которыми Вы следите - изменились.

** я бы посветовал Вам почитать как работает кэш в ASP.NET. Потом просто перенести архитектуру в VFP (там ничего сложного нет).

*** данные по доступу к отдельным сегментам приложения, не изменяемым справочники системы обычно хранятся в кэше with long expiration time.

**** если пользователь обновляет данные, которые кэшируются - обычно все данные или частично по дате обновления переписываются.

***** для небольших прложений можно использовать технологию replication in MS SQL server. При грамотном распределение данных между подписчиками вполне неплохо получается - в каждой локальной сети у Вас будет по своему SQL Server и соответсвенно с кэшами можно не "заморачиваться"... На клиентах бесплатные урезанные MS SQL сервера.

****** можно посмотреть в сторону MS Azure но я думаю что это пока ещё дороговато да и цены не снижаются...

Good luck!
24 апр 18, 11:08    [21363475]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
Про кэширование конечно хорошо написано.
Но я бы в этом случае, слез с фокса, и писал бы на чем то более адекватном.
Потому, надо бы разобраться откуда тормоз. Может переделать что то в консерватории.
При переходе с файл-сервера, клиент -сервер, иногда и логику надо подтачивать)

MaestroEv
...
Ранее в таблицах VFP это работало на ура.
Модуль DOSTUP Обращается к таблицам и проверяет доступ.
В условиях MySQL , полагаю это слишком расточительно и скорость упала до неприемлимой, потому что модуль DOSTUP
теперь всякий раз стучится к MySQL , а это похоже не шустрое мероприятие.. Тем более пунктов меню предостаточно, да и доступов разных в программе масса подобного типа:


Если общие условия использования ПО не изменились, то работа (правильная) с MySQL по меньшей мере, будет не медленнее чем с табл. фокса.
Ищите где тормоз.
Что касается меню, может при его заполнении, сразу и заполнить 1 раз, что этому юзеру можно что нет, и больше не лазить?
У меня просто иначе реализовано, когда создается объект, из БД получаю, что ему доступно в этом объекте.
И в общем то использую роли, а не персональные настройки
Но это лирика все. Ищите где тормоз.
Не может же там быть ОГРОМНЫЙ запрос.
Такие запросы как правило -миллисекнда, и ни на что не влияют
24 апр 18, 12:31    [21363854]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
asdor,
Да, все так и у меня.
Dostup("добавлениеклиента") или Dostup("редактированиесчета") - это ничто иное как обращение к таблице и считывание есть у пользователя этот доступ или хотите роль.

У Вас обращение к MySQL - это миллисекунды? Вот тут и проблема!!!!!!!!!!!!

В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.

Соответственно, если меню содержит 500 строк кода, и к каждому пункт есть DOSTUP из базы по ролям, то это уже 6 минут на запуск и торможение во время движения по секунде на каждой строке !
25 апр 18, 02:44    [21366394]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Sergey Ch
- (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше?
* в общем не правильно. Данные должны быть уже в памяти приложения. Создайте свой класс кэша в FoxPro - у него должно быть ограничено время, когда кэш устаревает и при новом обращении к массиву данных - происходит обновление с сервера. В MS SQL Server есть встроенная функция оповещения подписчиков если данные за которыми Вы следите - изменились.
Good luck!


Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.
25 апр 18, 03:03    [21366397]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
MaestroEv,
Тогда вернитесь к 1му вопросу.
Создайте коннект, и пользуйтесь им всегда.
Т.е. 1й вариант.
Если скорость вырастет - вот вам и ответ на 1й вопрос.
25 апр 18, 07:36    [21366506]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
asdor,
Пардон - 2й вариант 1го вопроса)
25 апр 18, 07:37    [21366508]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13354
MaestroEv
В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.

Подозреваю что тормоза из-за постоянного открыть-закрыть.
25 апр 18, 07:48    [21366526]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
Dima T
Подозреваю что тормоза из-за постоянного открыть-закрыть.

Когда работал с MySql та же хрень была. Первый толчок был перейти на постоянное соединение.
Правда мускул тогда 3й был.
Думал что то изменилось...
Да и тогда, полагаю, что то в настройках не то было.
MS SQL мгновенно коннектится.
ТС - а почему на мускул переходите?
Есть бесплатные почти у всех.
Пока в процессе, подумайте...)
25 апр 18, 07:58    [21366544]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13354
MaestroEv
Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.

Эти вопросы лучше в форуме по MySql задать. Возможно есть какие-то штатные средства для решения твоей задачи.

Можно собственный велосипед изобрести: если изменения относительно редки, то завести в базе отдельную таблицу с одной записью и там хранить дату-время последнего изменения. Менять дату при каждом внесении изменений. Прочитать одну строку займет немного времени, намного меньше 0.8 сек.
Ответ можно кэшировать на несколько сек, тогда при работе с меню будет не 500 обращений к БД, а одно в несколько секунд.
25 апр 18, 07:59    [21366547]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8736
MaestroEv
Соответственно, если меню содержит 500 строк кода, и к каждому пункт есть DOSTUP из базы по ролям, то это уже 6 минут на запуск и торможение во время движения по секунде на каждой строке !


-- таблица с правами доступа как раз первый кандидат для кэширования. И тогда меню будут стриться из таблицы памяти быстрее чем в настоящий момент.

MaestroEv
В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.


-- к сожалению я не знаю архитектуры Вашей системы. Где у Вас SQL server? В локальной сети? Тогда 0.8с это очень много. Как Вам уже посоветовали выше - надо задать этот вопрос на тематическом MySQL форуме (я сейчас в основном работаю с Oracle и MS SQL Server). В общем скорость работы сервера зависит от:
- скорости сети и внутренней firewall
- железа на котором "крутится" MySQL server
- версия - коммерческая/не коммерческая
- клиентский драйвер (очень сильно зависит)
- сколько пользователей в сети

-- по большому счёту я бы отказался от MySQL а пользу MS SQL Server. Можно начать с официально бесплатной версии Express Edition (до 50 пользователей и при правильно архитектуре приложения более чем достаточно). Будет мало - можно купить следующую версию.

-- интересно, скольуко у Вас пользователей? Все они в одной локальной сети? Или есть филиалы?

-- в конфигурации с replication которую я описал выше у нас примерно 800 магазинов от Штатов да Малазии. В каждом магазине по express edition of the MS SQL Server. К этому серверу по локальной сети подключаются кассовые терминалы (до 24 штук в самом большом магазине в Лондонстане). В отведённое время сервер передаёт данные на центральный сервер. Данные сегментированы строго по тому товару, который есть в данном магазине etc... В общем всё просто и надёжно. Перебои в глобальной сети ни на что не влияют, всё работает очень быстро...
25 апр 18, 22:26    [21369313]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8736
Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?

-- если честно, никто не кэширует информацию, с которой работают. Например, при выписке счёта запрашиваются "живые" остатки, одновременно блокируются чтобы кто-то другой не продал Ваш товар. После окончания выписки - база данных обновляется. Я не думаю что при работе с таблицами у Вас другая архитектура.

-- да, кэш устаревает по времени. У нас как правило три градации в зависимости от того, как меняются данные. Справочники подгружаются по мере потребности. При запросе загрузка идёт в кэш и потом уже Вы работает с данными из памяти. Устарели данные - ничего не происходит, пока они Вам снова не потребовались...

Или все же событие, что ест изменения в таблицах?

-- такое есть в MS SQL Server (в MySQL скорее всего нет) называется "SQL Server Notification Services". Почитайте. Мы их использовали немного лет 8 назад, но когда у тебя более 20000 запросов в секунду, этот сервис просто "убивал" наш MS SQL Server и мы отказались в пользу распределённого кэша который устаревает по времени. А Вам может быть и подойдёт.
25 апр 18, 22:38    [21369350]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Сервер находиться где-то в интернете.
Выбор на MySql пал из-за простой возможности сделать на нем сразу инет магазин, чтобы не гонять данные из программы по учету на сайт. Так сказал тот кто пишет сайт.
Фокс выступит как-бы программой для работы продвинутых пользователей, руководства (потому что бизнеслогика вся описана и переход будет не такой болезненный), а через броузер пишем работу продавцов и клиентов..

Ок. Спасибо. Я понял, что решение комплексное. И придется чуть поменять логику работы.. с некоторыми модулями.

А держать соединение MySQL все время открытым - это насколько плохо и почему?

Полученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?
28 май 18, 06:09    [21445017]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13354
MaestroEv
Сервер находиться где-то в интернете.

...

А держать соединение MySQL все время открытым - это насколько плохо и почему?

В таком случае вообще нельзя разрешать доступ к MySQL извне. Сломают.

Стандартный подход - сделать какое-нибудь WebAPI и работать через него.
28 май 18, 07:22    [21445054]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 436
MaestroEv
Сервер находиться где-то в интернете.
Выбор на MySql пал из-за простой возможности сделать на нем сразу инет магазин, чтобы не гонять данные из программы по учету на сайт. Так сказал тот кто пишет сайт.

Фокс выступит как-бы программой для работы продвинутых пользователей, руководства (потому что бизнеслогика вся описана и переход будет не такой болезненный), а через броузер пишем работу продавцов и клиентов..
Ок. Спасибо. Я понял, что решение комплексное. И придется чуть поменять логику работы.. с некоторыми модулями.
[/quot]
Ну может чуть, а может и не чуть. Я бы советовал сесть, и нарисовать новую ПРАВИЛЬНУЮ схему БД, с учетом жестких требований безопасности.

MaestroEv
А держать соединение MySQL все время открытым - это насколько плохо и почему?

Ничего плохого в этом нет.

MaestroEv
Полученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?

Вот тут, мне кажется за вопросом, стоит ошибка в работе.
Тащить клиенту, надо ОЧЕНЬ ограниченный набор данных. Индексировать, для упорядочивания самим клиентом - легко.
А поиск, по небольшому курсору, на фига тратить время на индекс, locate и даже время не заметите. И не надо никаких индексов для этого.
28 май 18, 07:59    [21445099]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Действительно надо привыкать к Locate.
Справляется легко. Более того не нужно думать об индексах. :)
Спасибо.
29 май 18, 06:34    [21448711]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Еще вопросик..
Я получил курсор запросом с MySql. Можно ли как-то в него делать Insert хотя бы одной записи?
8 окт 18, 10:46    [21697780]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13354
В MSSQL можно, в MySQL не знаю, попробуй, скорее всего вставит.
8 окт 18, 10:49    [21697785]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Да. Вставляет. Спасибо.
8 окт 18, 10:59    [21697797]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить