|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Два пользователя подключаются к базе данных. Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox начинает вводить информацию. Второй пользователь в это время пытается зайти в этот же справочник товара, но программа подвисает на команде: repl all pr_v&v with 0 на init формы. Пока первый не закончит ввод в textbox, у второго все висит. Подобное происходит в разных местах программы, где есть аналогичная ситуация. Сама программа была когда-то локальной, потом ее переработали под сетевую самым минимальным способом: убрали команды, требующие эксклюзивного доступа, организовали рабочие файлы для каждого пользователя в отдельные папки. Короче, она уже много лет работала, но оказалось, что было всего 2 пользователя, которые не особо пересекались на вводе информации. Теперь добавился третий пользователь и вылезло то, о чем никто не подозревал. Подскажите, пожалуйста, что можно предпринять? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 21:31 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
а зачем? repl all pr_v&v with 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 21:55 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Нужно простио по всей таблице вычистить колонку, напр., для checkbox. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:01 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_BuchНужно простио по всей таблице вычистить колонку, напр., для checkbox.И почему кто-то один у всех чистит эту колонку? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:04 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
это колонка как раз для каждого пользователя своя. поле pr_v&v, где v - номер пользователя. там до 10 сделано, на большее количество пользователей не рассчитано. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:07 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buchэто колонка как раз для каждого пользователя своя. поле pr_v&v, где v - номер пользователя. там до 10 сделано, на большее количество пользователей не рассчитано.Тем более непонятно, почему эту колонку чистит не тот для кого она, а кто-то другой? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:09 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Sergey Sizov, кстати, проверьте, а не с одним ли номером эти пользователи? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:10 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Пользователи с разными номерами. Один с номером 1, второй сномером 2. Первый чистит колонку pr_v1, второй pr_v2. У каждого своя колонка. Тут что-то глобально не так в программе... В другом месте, например, висит на команде scan for !empty(ostoper) repl ostoper with 0 ends тут чистится другая колонка, в которую рассчитывается оперативный остаток по товару. Таже картина: один что-то вводит в документе (там открыт справочник товаров командой select), второй просто не может у себя этот справочник открыть, пока первый не закончит ввод. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:23 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_BuchТут что-то глобально не так в программе...Ага. Разделение данных разных пользователей по колонкам, а не по записям. В результате один пользователь постоянно что-то меняет в записях, с которыми работает другой пользователь. Дурдом. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 22:32 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
ну да, так и получается. а как по другому сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 23:23 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buchну да, так и получается. а как по другому сделать?Думать надо. Первое, что приходит в голову - убрать таки all из repl all pr_v&v with 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 23:35 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
pr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить. ну , если снимать пометку сразу после выбора товара, от этого можно избавиться. а как быть в других местах с аналогичной ситуацией, напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит. я вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2013, 23:51 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buchpr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить.Ну, это очень спорное утверждение. :) ну , если снимать пометку сразу после выбора товара, от этого можно избавиться. а как быть в других местах с аналогичной ситуацией, напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит. я вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает?Так, скорее всего, никто не делает. Не используют справочник еще и как временную таблицу одновременно для всех пользователей. Короче, надо, для начала, хорошенько подумать. Рассмотрим на примере галочек. Для расстановки галочек совершенно необязательно редактировать всем одну и ту же таблицу. Точнее, для расстановки галочек сам справочник лучше совсем не трогать. Давно отработана схема с получением каждым пользователем выборки из справочника с необходимыми ему данными и расстановкой галочек в этой выборке. Тогда никто никому не будет мешать. Что там еще есть мы не знаем и потому что-либо посоветовать не можем. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 00:18 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Завтра попробую переделать, где придумаю. Большое спасибо за советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 00:58 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buch, если с минимальными усилиями, то замените Код: sql 1.
на Код: sql 1. 2. 3.
сразу попустит ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 01:36 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Так я пробовала, не помогает. Похоже нужно вообще как-то от replace избавляться. Буду завтра думать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 02:41 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buch Похоже нужно вообще как-то от replace избавляться. Буду завтра думать. Нужно избавляться не от replace, а от взаимных блокировок. В общем, приложение нужно перерабатывать, желательно полностью. И с применением принципов клиент-серверных технологий: - на клиента должны попадать только те данные, которые необходимы в данный момент - данные обрабатываются и изменения отсылаются на сервер. - с сервера перезапрашиваются измененные данные и отображаются клиенту.... Хоть тут некоторые и ругают книгу Попова по FoxPro 2.5/2.6, но там описывается различие локального и сетевого приложений и даются рекомендации как писать приложения, работающие как локально, так и в сети... Почитайте на досуге... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 07:53 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Станислав С...кий А когда у ней возникнет следующая подобная проблема, вы ей калькулятор посоветуете? Избавляться нужно от таких программ. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 09:00 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
sg12Станислав С...кий А когда у ней возникнет следующая подобная проблема, вы ей калькулятор посоветуете? Еще в Библии было сказано, что намного лучше дать инструмент и научить им пользоваться, чем сделать за человека его работу... Я даю ссылку на инструкцию по пользованию инструментом... и инструкцией этой каждый может воспользоваться в меру своих способностей.... sg12Станислав С...кий Избавляться нужно от таких программ. Нужно. Но не всегда возможно... Ибо заменить их просто нечем... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 15:13 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Станислав С...кий Ну вы и нашли Библию и ее Христа - Попова. Больше на секстанство смахивает. И уж по товарам программу не найти ... 1С-шникам такое не отпустите - засмеют. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 18:12 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Есть подозрение что пользователю выведена в грид та самая таблица. Грид накладывает блокировку на текущую запись. При этом если установлено Код: sql 1.
то второй пользователь "зависнет" на Код: sql 1.
т.к. дойдет до заблокированной записи и будет ждать снятие блокировки первым пользователем. Если попытаться обойтись малой переделкой, то Код: sql 1.
Так же у repl есть другие проблемы с блокировками, не помню детали, т.к. не использую. Поэтому лучше заменить repl на Код: sql 1.
Тут проблема подвисания не снимается полностью, но вероятность ее появления уменьшается. Ну а по-хорошему использовать какой-то локальный курсор с записью в базу каждого изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2013, 19:40 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
авторDima T, Есть подозрение что пользователю выведена в грид та самая таблица. Грид накладывает блокировку на текущую запись. Не обязательно, если я правильно понял ТС, то : автор Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox м.б. и форма где GET на прямую из таблицы, и exclusive off не поможет при replace all у второго пользователя. Если ТС не хочет менять устоявшуюся модель обработки данных и так сильно любит своих пользователей, что при каждом открытии формы делает replace всей таблицы, а выше приведенные советы по отбору и обновлениям через запросы просто пугают, могу посоветовать разделить эту таблицу на две, в одной собственно данные, а вторая для "галочек", ее создавайте перед открытием основной формы, связывайте с основной, обрабатывайте ее как хотите, и после работы с формой уничтожайте. По крайней мере это уменьшит пересечение с другими пользователями. Имя второй таблицы генерите динамически )). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2013, 17:36 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_BuchДва пользователя подключаются к базе данных. Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox начинает вводить информацию. Второй пользователь в это время пытается зайти в этот же справочник товара, но программа подвисает на команде: repl all pr_v&v with 0 на init формы. Пока первый не закончит ввод в textbox, у второго все висит. Подобное происходит в разных местах программы, где есть аналогичная ситуация. Сама программа была когда-то локальной, потом ее переработали под сетевую самым минимальным способом: убрали команды, требующие эксклюзивного доступа, организовали рабочие файлы для каждого пользователя в отдельные папки. Короче, она уже много лет работала, но оказалось, что было всего 2 пользователя, которые не особо пересекались на вводе информации. Теперь добавился третий пользователь и вылезло то, о чем никто не подозревал. Подскажите, пожалуйста, что можно предпринять? В общем, дело, разумеется, в блокировках. 1. Первый пользователь начал редактировать запись и заблокировал ее 2. Второй пользователь "бесконечно" ждет снятия блокировки с записи, чтобы внести в нее изменения Варианты действия у Вас следующие 1. Переделать программу с тем, чтобы процесс редактирования записи не приводил к ее блокировке 2. Переделать программу с тем, чтобы не требовалась глобальное обновление всех записей таблицы 3. Перед глобальным обновлением записей таблицы попытаться вручную наложить блокировку Насколько я понимаю, первые два варианта для Вас в настоящее время не приемлемы. Тогда остается только третий вариант, как некая "затычка". Делается это примерно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 23:02 |
|
Зависание программы по команде replace
|
|||
---|---|---|---|
#18+
Anna_Buchpr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить. ну , если снимать пометку сразу после выбора товара, от этого можно избавиться. Как уже заметил Сергей, использование постоянных таблиц для хранения временных данных (в данном случае "птичек") крайне не удачное решение. "Птички", очевидно, должны ставится в каких-то временных данных. Идеальное решение - это выборка с дополнительным полем (Local View, CursorAdapter, Select-SQL). Решение несколько хуже - временная таблица (курсор), которая создается в момент открытия формы и содержит только два поля: идентификатор записи и поле для "птички". Еще одно решение - табличная буферизация. Перед сбросом буфера откатить все "птички" Однако, как Вы понимаете, все эти решения требуют серьезной переделки приложения. Anna_Buch а как быть в других местах с аналогичной ситуацией, Каждый случай требует отдельного рассмотрения. Anna_Buch напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит. Это как? Групповое удаление записей в справочнике? В смысле, Вы цифру 2 ставите через replace all? Как-то у меня воображения не хватает на такое Если же речь идет о последующем физическом удалении, так этот процесс требует монопольного доступа. Конфликт с другими пользователями невозможен. Anna_Buchя вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает? Никто. При написании приложений, с которыми одновременно могут работать несколько пользователей, всегда используется, так называемая, оптимистическая буферизация. Либо "самопальная" (на курсорах или переменных памяти) или стандартная - cursorSetProp("Buffering"). Основная идея заключается в том, чтобы разделить процесс редактирования данных пользователем и собственно сохранение внесенных изменений в таблицах. Т.е. пока у пользователя открыта для редактирования форма, данные никак не блокируется. Пользователь вносит изменения в некий "буфер данных". Можете считать это некой прозрачной "калькой" положенной на лист с данными. И пользователь "чиркает" именно эту "кальку". А вот когда пользователь завершил процесс редактирования и, условно, нажал кнопку "Сохранить", то только в этот момент данные блокируются и в них переносятся все изменения с "кальки" (из буфера). В результате, собственно блокировка данных всегда занимает крайне незначительное время. Даже если два пользователя "одновременно" нажали кнопку "Сохранить", но ждать им придется не очень долго. Разумеется, при подобной стратегии возникают конфликты совместного доступа (два пользователя изменили одни и те же данные). Но как их решать зависит уже от конкретной постановки задачи. Проблема носит не столько технический, сколько организационный характер. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2013, 23:34 |
|
|
start [/forum/topic.php?fid=41&fpage=36&tid=1582807]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
117ms |
get tp. blocked users: |
2ms |
others: | 323ms |
total: | 542ms |
0 / 0 |